为什么 SQLite 不自动将这个查询分成两部分?

问题描述 投票:0回答:2

我有两张桌子要加入。 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 能够自动执行此操作(至少在第二种情况下),但事实并非如此。

为什么?

caching sqlite inner-join
2个回答
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
投票

来自SQLite 用户邮件列表的答复:

简而言之,因为 SQLite 无法读懂你的想法。 要了解答案,请比较执行一个查询的速度(与 一个 TABLE_A) 并创建一个内存数据库,在其中创建一个表 它并在一个查询中使用该表(具有相同的 TABLE_A)。我打赌 第一个选项(无需内存数据库的直接查询) 会快得多。所以 SQLite 选择最快的方式来执行你的 询问。它无法预测未来的查询将要理解什么 如何更快地执行整组查询。你可以这样做并且 您应该将查询分成两部分。 帕维尔
© www.soinside.com 2019 - 2024. All rights reserved.