Я всегда удалял дубликаты с таким запросом:
delete from test a
using test b
where a.ctid < b.ctid
and a.col1=b.col1
and a.col2=b.col2
and a.col3=b.col3
Кроме того, я видел, как этот запрос использовался:
DELETE FROM test WHERE test.ctid NOT IN
(SELECT ctid FROM (
SELECT DISTINCT ON (col1, col2) *
FROM test));
И даже этот (повторяется до тех пор, пока вызакончились дубликаты):
delete from test ju where ju.ctid in
(select ctid from (
select distinct on (col1, col2) * from test ou
where (select count(*) from test inr
where inr.col1= ou.col1 and inr.col2=ou.col2) > 1
Теперь я столкнулся с таблицей с 5 миллионами строк, в которой есть индексы в столбцах, которые будут соответствовать в предложении where.И теперь мне интересно:
Какой из всех тех методов, которые, по-видимому, делают то же самое, является наиболее эффективным и почему?Я просто запускаю второй, и это занимает более 45 минут, чтобы удалить дубликаты.Мне просто интересно, какой из них будет наиболее эффективным, на случай, если мне придется удалить дубликаты из другой огромной таблицы.Не имеет значения, имеет ли он первичный ключ, вы всегда можете создать его или нет.