哪个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查询更快?的主要内容,如果未能解决你的问题,请参考以下文章