我知道这可能是多余的,但是我已经运行了近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万条记录,并建立了索引,所以我仍然有点担心为什么需要这么长时间才能完成。有什么想法吗?
答案 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);