哪个sql查询更快?

Posted

技术标签:

【中文标题】哪个sql查询更快?【英文标题】:Which sql query is faster? 【发布时间】:2014-12-25 11:29:56 【问题描述】:

我正在使用 postgresql 数据库并希望改进查询(第一个)。我将其重写为第二个。但是我读了一篇文章,上面说“NOT IN”是非常缓慢的构造。我希望您说出两者中哪一个更快和/或提出更好的解决方案。

第一次查询

UPDATE reseller_product d SET status=3 FROM (
    SELECT reseller_product.sku FROM reseller_product
    LEFT OUTER JOIN main_table ON main_table.sku=reseller_product.sku
    WHERE main_table.sku IS NULL AND reseller_product.reseller_id='||resID||'
)as r
WHERE d.sku=r.sku and d.distributor_id='||distrID||' and d.reseller_id='||resID||'

第二次查询

UPDATE reseller_product SET status=3
WHERE distributor_id='||distrID||' AND reseller_id='||resID||' 
AND sku NOT IN (SELECT sku FROM main_table);

编辑

抱歉,没有注意到第二个查询中名称为“d”的错误

【问题讨论】:

答案取决于 .sku 的 NULLability 及其唯一性和基数。顺便说一句:此查询的第三个版本使用NOT EXISTS() ALSO:相关名称d 未在第二个查询中定义。所以查询会失败,所以会是最快的。 您可以使用命令“EXPLAIN”来详细说明查询的执行计划——这可能会对您有所帮助:postgresql.org/docs/9.2/static/sql-explain.html @wildplasser 相关名称 d 未在第二个查询中定义。所以查询会失败,所以会是最快的。这真的很真实也很有趣。 :) 更有趣的是:它将在恒定时间内运行,与数据的结构、大小和分布无关! 【参考方案1】:

重写查询可能会有所帮助,但我会首先检查 main_table 和 reseller_product 是否在 sku 上都有索引。搜索(和连接)非索引字段的复杂度为 O(n),而索引字段的复杂度为 O(log(n)) 或常量,具体取决于索引实现。

【讨论】:

【参考方案2】:

第三版:

UPDATE reseller_product u
SET status = 3
WHERE u.distributor_id = '||distrID||'
  AND u.reseller_id = '||resID||' 
  AND NOT EXISTS (
    SELECT * FROM main_table m
    WHERE m.sku = u.sku
    );

【讨论】:

以上是关于哪个sql查询更快?的主要内容,如果未能解决你的问题,请参考以下文章

哪个sql查询更快?

插入、更新或删除 MongoDB 或 SQL 哪个更快?

数据集与Sql查询(选择,过程,函数)哪个更好用?

根据ID ,查询一个字段和全部查询哪个快

为啥我的 Sql 查询第二次运行更快?

SQL查询性能调优--如何使查询更快