以下查询需要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的最新版本。
答案 0 :(得分:1)
SQLite的查询优化器相当简单,does not support OR
expressions very well。
出于某种原因,可以优化此查询,如果它可以使用覆盖索引,那么试试这个:
CREATE INDEX TakeThatNHibernate ON Product(Number, Name)
答案 1 :(得分:0)
1=1
和1=0
是NHibernate
框架的某些部分中使用的SQL表达式,用于表示不会改变sql查询逻辑的空语句。没有子标准的Conjunction
生成1=1
表达式,没有子标准的A Disjunction
生成1=0
表达式。如果没有提供值,In()会生成1=0
表达式。
为避免此类优化,您可以更改创建这些空表达式的代码,并仅使用至少有一个子标准的标准。