0

次のクエリの実行には 5 秒かかります。

SELECT DISTINCT(Product.Name) FROM Product WHERE (0=1 OR Product.Number="prod11");

以下はわずか15ミリ秒しかかかりません:

SELECT DISTINCT(Product.Name) FROM Product WHERE (Product.Number="prod11");

興味深いことに、以下も 15 ミリ秒しかかかりません。

SELECT DISTINCT(Product.Name) FROM Product WHERE (1=1 AND Product.Number="prod11");

クエリ プランは、最初のクエリが (なんらかの理由で) フル テーブル スキャンを使用しているのに対し、2 番目と 3 番目のクエリは (予想どおり) インデックスを使用していることを示しています。

何らかの理由で、Sqlite は「1=1 AND ...」を最適化するように見えますが、「0=1 OR ...」は最適化しません。

Sqlite が最初のクエリにもインデックスを使用するようにするにはどうすればよいですか?

クエリはNHibernateによって構築されているため、変更するのはちょっと難しいです...

Sqlite のバージョンは、Windows 用の最新バージョンです。

4

2 に答える 2

1

SQLite のクエリ オプティマイザーはかなり単純で、式をあまりサポートしていませんOR

何らかの理由で、カバリングインデックスを使用できる場合、このクエリを最適化できるので、次のようにしてください。

CREATE INDEX TakeThatNHibernate ON Product(Number, Name)
于 2012-11-12T18:41:44.400 に答える
0

1=1とは、SQL クエリのロジックを変更しない空のステートメントを示すため1=0に、フレームワークの一部で使用される SQL 式です。サブ基準のない A は式を生成し、サブ基準のNHibernateないAは式を生成します。値が指定されていない場合、In() は式を生成します。Conjunction1=1Disjunction1=01=0

このような最適化を回避するには、これらの空の式を作成しているコードを変更し、少なくとも 1 つのサブ基準を持つ基準のみを使用することができます。

于 2012-11-12T19:04:37.377 に答える