私たちのアプリケーションは、NHibernateで生成されたSQLクエリを発行します。アプリケーションランタイムでは、SQL Serverデータベースに対してクエリを実行するのに約12秒かかります。 SQLプロファイラには500,000を超える読み込みが表示されます。同じSQLクエリNHibernateアプリケーションの方がSQL Studioより遅いですか?
しかし、SQLプロファイラを使用して正確なクエリテキストを取得し、SQL Studioから再度実行すると、5秒かかり、4,600未満の読み取りが表示されます。
クエリは、SQLテキストの最後に値が提供されるいくつかのパラメータを使用します。パラメータスニッフィングと非効率なクエリプランについては少し読んでいますが、ストアドプロシージャに関連すると考えていました。たぶんNHibernateは、より長い期間を説明することができるエンティティをインスタンス化しながら、結果セットを開いて保持しますが、NHibernateが実行したのと同じクエリに対して余分な494,000の "読み込み"を説明することができますか? (追加のクエリは、SQLプロファイラトレースに表示されません。)
クエリは、Hibernate 3.1のLINQ機能を使用してLINQクエリとして指定されています。このような劇的な違いを説明できるのは、哲学の基本的な問題のように思われるため、クエリ自体は含まれていませんでした。
該当する場合、結果にvarbinary(max)列が存在することもありますが、私たちの状況では常にnullが含まれています。
洞察が大変ありがとうございます。
パラメータだけではなく、ストアドプロシージャパラメータ化クエリをアドホックに適用さを経由して、いつでも実行キャッシュから手抜き計画を掘ることができます。これらの計画は、最初のパラメータセットに従ってコンパイルされ、おそらく異なるパラメータ値で後続の呼び出しに再利用されます。 –
問題を解明したことはありますか?私は同じことを実行しているし、私のすべてのパラメータはintsなので、どうやってそれが問題になるのか分かりません。 – Justin