使用OR和AND进行Sqlite查询优化

时间:2012-11-12 16:26:38

标签: sqlite nhibernate

以下查询需要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");

查询计划显示第一个查询使用全表扫描(出于某种未知原因),而第二个和第三个查询使用索引(如预期的那样)。

出于某种原因,看起来Sqlite优化了" 1 = 1 AND ..."但它并没有优化" 0 = 1 OR ..."。

如何让Sqlite也使用第一个查询的索引?

查询是由NHibernate构建的,所以很难改变它们......

Sqlite版本是Windows的最新版本。

2 个答案:

答案 0 :(得分:1)

SQLite的查询优化器相当简单,does not support OR expressions very well

出于某种原因,可以优化此查询,如果它可以使用覆盖索引,那么试试这个:

CREATE INDEX TakeThatNHibernate ON Product(Number, Name)

答案 1 :(得分:0)

1=11=0NHibernate框架的某些部分中使用的SQL表达式,用于表示不会改变sql查询逻辑的空语句。没有子标准的Conjunction生成1=1表达式,没有子标准的A Disjunction生成1=0表达式。如果没有提供值,In()会生成1=0表达式。

为避免此类优化,您可以更改创建这些空表达式的代码,并仅使用至少有一个子标准的标准。