【问题标题】:postgreSQL query seems to be running on infinite looppostgreSQL 查询似乎在无限循环上运行
【发布时间】:2020-12-13 03:10:12
【问题描述】:

my previous question 之后,我现在正尝试从我的数据库中删除重复项。我首先运行一个子查询来识别几乎相同的记录(唯一的区别是索引列“id”)。我的表大约有 900 万条记录,下面的代码必须在大约 1 小时 30 后中断

DELETE FROM public."OptionsData" 
WHERE id NOT IN
(
    SELECT id FROM (
        SELECT DISTINCT ON (asofdate, contract, strike, expiry, type, last, bid, ask, volume, iv, moneyness, underlying, underlyingprice) * FROM public."OptionsData"
    ) AS TempTable
);  

从子查询生成结果大约需要 1 分钟,因此运行完整查询可能需要很长时间 (?) 或者我的代码中是否有问题?

【问题讨论】:

  • 你有多少副本?
  • 记录总数:8'764'239 子查询表明:8'681'440 条唯一记录 所以 82'799 重复 Humm 然后假设 1 秒删除一条记录,这几乎需要23 小时 (?)

标签: sql postgresql duplicates


【解决方案1】:

NOT IN 与 DISTINCT 结合通常很慢。

使用 EXISTS 删除重复项通常更快:

DELETE FROM public."OptionsData"  d1
WHERE EXISTS (select *
              from public."OptionsData" d2
              where d1.id > d2.id
                and (d1.asofdate, d1.contract, d1.strike, d1.expiry, d1.type, d1.last, d1.bid, d1.ask, d1.volume, d1.iv, d1.moneyness, d1.underlying, d1.underlyingprice) 
                    = (d2.asofdate, d2.contract, d2.strike, d2.expiry, d2.type, d2.last, d2.bid, d2.ask, d2.volume, d2.iv, d2.moneyness, d2.underlying, d2.underlyingprice)
              )

这将保留id 中具有最小值的行。如果您想保留id 最高的用户,请使用where d1.id < d2.id

【讨论】:

  • 谢谢,EXISTS 肯定更快!!
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2014-01-04
相关资源
最近更新 更多