以下是两个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'并消除任何重复的行。将结果添加到结果行列表中答案 0 :(得分:0)
对于连接,SQLite仅支持两个表上的嵌套循环连接(可以使用索引进行优化)。 如The SQLite Query Planner和Query Planning中所述,一次与两个表连接不是受支持的优化之一。