質問

ポッドキャストから、実行計画の再利用に適したソリューションがあるORMはないと聞きました。パフォーマンスに影響を与える実行計画キャッシュの増加につながります。

  • Nhibernateは実行計画をどのように処理しますか?
  • 実行計画はNhibernateで再利用されていますか?
役に立ちましたか?

解決

最初の質問に答えるために、Nhibernateは実行計画を処理しません。 SQL Serverは実行計画を処理します。 Nhibernateによって生成された動的SQLがパラメーター化されている場合、計画は「準備」として分類され、その後の各実行で提供されるパラメーターが同じ最適化されたクエリプランを作成できると仮定して再利用されます。動的SQLがパラメーター化されていない場合、実行計画は「アドホック」に分類され、 たぶん......だろう まだ再利用されています。

このビットのT-SQLを使用して、さまざまなクエリプランのキャッシュサイズを監視しています。 Paul Randalのサイト(http://www.sqlskills.com/blogs/paul/)からこれをコピーしたと思いますが、確かに知ることができないほど長いです。

SELECT 
    objtype AS [CacheType],
    count_big(*) AS [Total Plans],
    sum(cast(size_in_bytes as decimal(12,2)))/1024/1024 AS [Total MBs],
    avg(usecounts) AS [Avg Use Count],
    sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 AS [Total MBs - USE Count 1],
    sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs - USE Count 1] DESC;
GO

他のヒント

ORMは通常、それ自体が問題ではなく、それらがどのように使用されるかです。 SQL Serverは実行計画を生成します。 Nhibernateは、SQLに悪い実行計画を生成するクエリを生成できます。クエリで変数を使用すると、実行計画を再利用できます。文字列連結は通常、計画の再利用を防ぎます。見る この質問 詳細については。

すでに言及されているパラメーター化の問題に加えて、すべてのormは本当にくだらない計画を生成する可能性があります。これは、多くの検索オプションがある場合に最も頻繁に行われます。これは、SQL Serverクエリの句またはSQL Serverが非常に多くのことを行うことができないステートメントで非常に大きな場合に行われます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top