【问题标题】:NOT IN query performance issue with large dataNOT IN 大数据的查询性能问题
【发布时间】:2021-05-18 11:49:00
【问题描述】:

我试图获取 id,而表中的数字条件为 number 不在 id 中。

select id,number from tmp_t where number not in (select id from tmp_t)

已经尝试过查询,它需要很长时间......差不多 40 分钟,我与服务器断开连接。 所以我该怎么做?数据大约有 500K 行..

所以我想显示“这里是 id 和数字,id 中不存在该数字。” 因为我尝试插入数字,但数字是 FK 并且取决于 ID,所以我想知道 id 和数字,这就是我使用 not in 的原因。

也许有人知道?顺便说一句,我正在使用 Postgresql-13

【问题讨论】:

    标签: postgresql query-optimization


    【解决方案1】:

    您可以改用 NOT EXISTS 来编写它,尽管如果 id 的任何值为 NULL,这些查询将产生不同的结果(在这种情况下,NOT IN 可能不会产生您想要的答案,因此从这个角度来看,NOT EXISTS 更好,因为好吧。)

    select id,number from tmp_t where not exists 
        (select 1 from tmp_t a where a.id=tmp_t.number);
    

    但只要 work_mem 足够大,您的公式也是有效的。

    【讨论】:

      【解决方案2】:

      通常 NOT EXISTS 更快(如果涉及 NULL 值,也不会感到意外):

      select t1.id, t1.number 
      from tmp_t t1
      where not exists (select *
                        from tmp_t t2
                        where t2.id = t1.number)
      

      【讨论】:

        猜你喜欢
        • 2018-06-21
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 2011-08-22
        • 2018-10-18
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多