内部联接优化

时间:2011-05-04 00:25:28

标签: caching sqlite inner-join

我有两张桌子要加入。 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能够自动为我做同样的事情(至少在第二种情况下),但似乎没有发生......为什么会这样?

感谢。

2 个答案:

答案 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 User Mailing List

的回答
总之,因为SQLite无法读懂你的想法。 要理解答案,比较执行一个查询的速度(用 一个TABLE_A)并创建一个内存数据库,在其中创建一个表 它并在一个查询中使用该表(具有相同的TABLE_A)。我打赌 第一个选项(没有内存数据库的直接查询) 会更快。所以SQLite选择了执行你的最快方式 查询。它无法预测未来的查询将被理解 如何更快地执行整个查询集。你可以做到这一点 您应该将查询分为两部分。 帕维尔