我有两张桌子要加入。 TABLE_A(包含列'a')和TABLE_BC(包含列'b'和'c')。 TABLE_BC上有一个条件。这两个表由'rowid'连接。
类似的东西:
SELECT a, b, c FROM main.TABLE_A INNER JOIN main.TABLE_BC WHERE (b > 10.0 AND c < 10.0) ON main.TABLE_A.rowid = main.TABLE_BC.rowid ORDER BY a;
可替换地:
SELECT a, b, c FROM main.TABLE_A AS s1 INNER JOIN (SELECT rowid, b, c FROM main.TABLE_BC WHERE (b > 10.0 AND c < 10.0)) AS s2 ON s1.rowid = s2.rowid ORDER BY a;
我需要使用不同的TABLE_A执行此操作,但TABLE_BC不会更改...因此,我可以通过为查询的常量部分创建临时内存数据库(mem)来加快速度。< / p>
CREATE TABLE mem.cache AS SELECT rowid, b, c FROM main.TABLE_BC WHERE (b > 10.0 AND c < 10.0);
接着是(很多)
SELECT a, b, c FROM main.TABLE_A INNER JOIN mem.cache ON main.TABLE_A.rowid = mem.cache.rowid ORDER BY a;
我从上面的所有查询得到相同的结果集,但最后一个选项是迄今为止最快的选项。
问题在于我希望避免将查询分为两部分。我希望SQLite能够自动为我做同样的事情(至少在第二种情况下),但似乎没有发生......为什么会这样?
感谢。
答案 0 :(得分:3)
SQLite对优化很轻松。一般经验法则:SmallTable Inner Join BigTable
比反向更快。
话虽如此,我想知道你的第一个查询是否会以下列形式运行得更快:
SELECT a, b, c
FROM main.TABLE_A
INNER JOIN main.TABLE_BC ON main.TABLE_A.rowid = main.TABLE_BC.rowid
WHERE (b > 10.0 AND c < 10.0)
ORDER BY a;
答案 1 :(得分:1)
总之,因为SQLite无法读懂你的想法。 要理解答案,比较执行一个查询的速度(用 一个TABLE_A)并创建一个内存数据库,在其中创建一个表 它并在一个查询中使用该表(具有相同的TABLE_A)。我打赌 第一个选项(没有内存数据库的直接查询) 会更快。所以SQLite选择了执行你的最快方式 查询。它无法预测未来的查询将被理解 如何更快地执行整个查询集。你可以做到这一点 您应该将查询分为两部分。 帕维尔