次のクエリの実行には 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 用の最新バージョンです。