什么原因导致带有OR子句的sqlite连接约束明显变慢?

时间:2012-10-19 23:48:42

标签: sqlite

以下是两个sqlite查询:

SELECT * FROM items JOIN licenses ON items.id=licenses.id OR items.type=licenses.type;

此查询不使用OR,而是使用UNION

SELECT * FROM items JOIN licenses ON items.id=licenses.id UNION SELECT * FROM items JOIN licenses ON items.type=licenses.type;

假设我在license表上有一个索引,并且类型上的licenses表中的索引不应该使用OR的第一个查询只会慢一点吗?

我看到第一个查询比Sqlite中的第二个查询慢大约20倍,原因是什么?

我希望第一个查询的内部计划看起来像这样:

  • 对于items表中的每一行:
  • id表的items列中获取值并使用它来查找licenses表中id表中的所有行,调用该匹配集行A。
  • type表的items列中获取值并使用它来查找licenses表中type表中的所有行,调用该匹配集行A'。 结合A和A'并消除任何重复的行。将结果添加到结果行列表中

1 个答案:

答案 0 :(得分:0)

对于连接,SQLite仅支持两个表上的嵌套循环连接(可以使用索引进行优化)。 如The SQLite Query PlannerQuery Planning中所述,一次与两个表连接不是受支持的优化之一。