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");

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

由于某种原因,Sqlite 似乎优化了“1=1 AND ...”,但没有优化“0=1 OR ...”。

我该怎么做才能使 Sqlite 也将索引用于第一个查询?

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

Sqlite 版本是 Windows 的最新版本。

4

2 回答 2

1

SQLite's query optimizer is rather simple and does not support OR expressions very well.

For some reason, it can optimize this query if it can use a covering index, so try this:

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

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

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

于 2012-11-12T19:04:37.377 回答