【问题标题】:Which sql query is faster?哪个sql查询更快?
【发布时间】: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


【解决方案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
        );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 2012-05-27
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多