DELETE查询运行时间过长

时间:2011-12-05 13:36:13

标签: postgresql sql-delete

我知道这可能是多余的,但是我已经运行了近3天的相同查询,在我杀了之前,我想进行社区健全检查。

DELETE
FROM    mytble
WHERE   ogc_fid NOT IN
    (SELECT     MAX(dup.ogc_fid)
        FROM        mytble As dup
        GROUP BY    dup.id)

mytble是表格的名称,ogc_fid是唯一ID字段的名称,id是我想要的字段的名称成为唯一的身份。表中有4100万条记录,并建立了索引,所以我仍然有点担心为什么需要这么长时间才能完成。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您提供了explain输出会很好,但是当您这样做时,您正在做的可能会更快(再次,我会查找explain) :

DELETE FROM mytable d
USING mytable m
 LEFT JOIN (SELECT max(ogc_fid) AS f FROM mytble GROUP BY id) AS q ON m.ogc_fid=q.f
WHERE d.ogc_fid=m.ogc_fid AND q.f IS NULL;

答案 1 :(得分:1)

如果我理解正确,您希望删除具有相同dup_id的记录的所有记录 (但存在更高的ogc_fid)。并且只保留那些ogc_fid最高的那些。

-- DELETE -- uncomment this line and comment the next line if proven innocent.
SELECT COUNT(*)
  FROM   mytble mt
 WHERE   EXISTS (
  SELECT *
    FROM mytble nx
   WHERE nx.dup_id = mt.dup_id    -- there exists a row with the same dup_id
     AND nx.ogc_fid > mt.ogc_fid  -- , ... but with a higher ogc_fid 
);

对于dup_id(可能在ogc_id上)的索引,对于41M记录,这应该运行几分钟。

更新:如果不存在索引,您可以通过首先创建索引来加速上述查询:

 CREATE UNIQUE INDEX sinterklaas ON mytble (dup_id, ogc_id);