SQLite3,INNER JOIN 优化

问题描述 投票: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_A 执行几次此操作,但 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.