我有两张桌子要加入。 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_As 执行此操作几次,但 TABLE_BC 不会改变。因此,我可以通过为查询的常量部分创建临时内存数据库 (mem) 来加快速度。
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 能够自动执行此操作(至少在第二种情况下),但事实并非如此。
为什么?
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;
来自SQLite 用户邮件列表的答复:
简而言之,因为 SQLite 无法读懂你的想法。 要了解答案,请比较执行一个查询的速度(与 一个 TABLE_A) 并创建一个内存数据库,在其中创建一个表 它并在一个查询中使用该表(具有相同的 TABLE_A)。我打赌 第一个选项(无需内存数据库的直接查询) 会快得多。所以 SQLite 选择最快的方式来执行你的 询问。它无法预测未来的查询将要理解什么 如何更快地执行整组查询。你可以这样做并且 您应该将查询分成两部分。 帕维尔