-1

.Where(x =>!x.Rated)これにより、次のようなSQLが作成されます:not(cdrcalltmp0_.Rated = 1)

私たちのdbaは、フィルターされたインデックスが機能するためには、notを削除する必要があると言っています。

.Where(x => x.Rated == false)これにより、次のようなSQLが作成されます。cdrcalltmp0_.Rated= @ p2 order by cdrcalltmp0_.Created asc '

パラメータが原因でこれは機能しません。

彼はこのSQLを望んでいます:cdrcalltmp0_.Rated = 0 order by cdrcalltmp0_.Created asc '

nhibernateにパラメータを使用させないようにすることは可能ですか?フィルタリングされたインデックスが機能するようにします。

4

1 に答える 1

0

序文: 次の回答は、SQL Server 2008 を使用していることを前提としています。そうでない場合、問題のデータベース テクノロジが NOT 演算子の使用時にインデックスをサポートしていない可能性は十分にあります。したがって、SQL Server 2008 を使用している場合...

あなたの DBA は、彼が何について話しているのかわかりません。

次の構文

NOT ( SomeTableAlias.SomeTableColumn = 1 )

SQL Server クエリ アナライザによって完全に理解されます。上記の構文とまったく同じように見えるNHibernateからのクエリを取得しましたが、それらは実際に適切なインデックスを使用しています。

そして、あなたの質問に答えるには、いいえ。Hibernate は、SQL を作成するときに常にパラメーターを使用します。パラメーター化されたクエリは、従来の ADO.NET を自分で使用している場合でも、非常に一般的な場所です。

NHibernate がパラメーターを使用しないようにする唯一の方法は、session.CreateSQLQuery() メソッドを使用して自分で実行する必要がある SQL を提供することです。

とにかく、あなたが投稿した上記の行:

Where(x => x.Rated == false) This creates sql that looks like: cdrcalltmp0_.Rated=@p2 order by cdrcalltmp0_.Created asc'

完全に有効です。SQL Server がパラメーター化されたクエリを受け取ると、Rated 列にあるすべてのインデックスが使用されます。

DBA がまだ疑問を持っている場合は、SQL Server Management Studio で "推定実行計画の表示" 機能をオンにしてクエリを実行するように DBA に伝えてください。これは、クエリがインデックスを使用していることを証明します。

于 2012-08-10T22:55:35.150 に答える