我进行了几次测试。EXISTS
事实证明,该变体要快得多- 正如我预期的那样,与@Tometzky发布的相反。
使用窗口函数应该比这个答案快得多:
select a
from (
select a, rank() over (partition by b, c order by a) as rank
from test ) as _
where rank>1;
在Postgresql 9.1.2上以适当的设置测试10.000行的平台:
CREATE TEMP TABLE test (
a serial
,b int NOT NULL
,c int NOT NULL
);
INSERT INTO test (b,c)
SELECT (random()* 100)::int AS b, (random()* 100)::int AS c
FROM generate_series(1, 10000);
ALTER TABLE test ADD CONSTRAINT a_pk PRIMARY KEY (a);
在第一轮和第二轮测试之间,我进行了:
ANALYZE test;
当我最终应用DELETE时,删除了3368个重复项。如果您重复的次数太多或更少,性能可能会有所不同。
我与每个查询一起运行了几次,EXPLAIN ANALYZE
并取得了最佳结果。通常,最佳与第一或最差没有什么不同。 裸露SELECT
(不带DELETE
)显示相似的结果。