2014-05-12 2 views
0

Я хочу удалить дубликаты из большой таблицы, содержащей около 1 миллиона строк и увеличивающейся каждый час. Он не имеет уникального идентификатора и имеет около ~ 575 столбцов, но редко заполняется.Удалить повторяющиеся строки из большой таблицы - PostgreSQL

Таблица «как» таблица журналов, где новые записи добавляются каждый час без уникальной отметки времени.

Дубликаты похожи на 1-3%, но я все равно хочу их удалить;) Любые идеи?

Я пробовал колонку ctid (как here), но ее очень медленно.

ответ

0

Основная идея, которая хорошо работает с PostgreSQL, заключается в создании индекса для хэша набора столбцов в целом.

Пример:

CREATE INDEX index_name ON tablename (md5((tablename.*)::text)); 

Это будет принято, если нет столбцов, которые не очень хорошо играть с непреложным требованием (в основном timestamp with time zone, потому что их приведение к тексту значения сеанса зависит).

После того, как этот индекс будет создан, дублирует предположительно может быть быстро найден самоприсоединение с хеш, запрос вида:

SELECT t1.ctid, t2.ctid 
FROM tablename t1 JOIN tablename t2 
ON (md5((t1.*)::text) = md5((t2.*)::text)) 
WHERE t1.ctid > t2.ctid; 

Вы также можете использовать этот индекс, чтобы избежать дубликатов строк в будущего, а не периодически их дублирования.

Смежные вопросы