【发布时间】: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 未在第二个查询中定义。所以查询会失败,所以会是最快的。这真的很真实也很有趣。 :)
-
更有趣的是:它将在恒定时间内运行,与数据的结构、大小和分布无关!
标签: postgresql join notin