我正在使用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”的错误
答案 0 :(得分:0)
重写查询可能有所帮助,但我首先要检查main_table和reseller_product是否都在sku
上有索引。搜索(和加入)非索引字段具有O(n)复杂度,而对于索引字段,它将是O(log(n))或常量,具体取决于索引实现。
答案 1 :(得分:-1)
第三版:
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
);