【问题标题】:Which query is more efficient?哪个查询更有效?
【发布时间】:2012-02-25 15:36:15
【问题描述】:

我目前有两个名为“名称”和“帐户”的表。我需要选择启用帐户的所有名称。所以我可以选择两种方式之一,但我想知道哪种方式更快、最有效?

第一种方法是选择所有已启用的帐户,然后在单独的查询中使用带有这些帐户的 where 子句(伪代码):

    SELECT account_id FROM accounts WHERE enabled=1;

然后

    SELECT * FROM names WHERE account_id IN (account_id_list);

或者我可以在表格上做一个简单的连接:

    SELECT * FROM names JOIN accounts USING account_id WHERE enabled=1;

名称表将有大约 10-25k 行,并且还将在使用 SQLite 的移动设备 (Android) 上运行。

谢谢!

【问题讨论】:

  • 使用命令EXPLAIN QUERY PLAN并找出:sqlite.org/eqp.html
  • 没想到...这可能是最好的答案!

标签: android sql sqlite optimization


【解决方案1】:

考虑到查询非常简单,并且 SQL 引擎在第一种情况下要做的很多工作只是格式化/将数据传递给您的程序,以便立即将其发送回并再次解析它,第二个版本应该会更高效(也可以为您的程序节省一些工作)

【讨论】:

    【解决方案2】:

    嵌套选择比连接好得多,所以只需将前两个查询合并为一个:

    SELECT * FROM names WHERE account_id IN (
    SELECT account_id FROM accounts WHERE enabled=1);
    

    【讨论】:

    • 我找不到任何关于 SQLite 在子查询方面比联接更好的信息。你有这方面的信息吗?
    • 不,我没有任何信息,只有使用 SQLite 的经验(您拥有的连接越多,差异就越大)。
    【解决方案3】:

    SELECT * FROM names WHERE EXISTS (SELECT 1 FROM accounts WHERE account_id = names.account_id AND enabled=1);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2011-03-09
      • 2011-05-23
      • 2015-03-14
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多