【问题标题】:INNER JOIN OptimizationINNER JOIN 优化
【发布时间】:2011-08-18 03:30:15
【问题描述】:

我有两个表要加入。 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


    【解决方案1】:

    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;
    

    【讨论】:

      【解决方案2】:

      SQLite User Mailing List回复:

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

      【讨论】:

        猜你喜欢
        • 2018-01-27
        • 2014-11-25
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2019-02-18
        • 2020-01-09
        相关资源
        最近更新 更多