Выступление GROUP BY в Postgres - PullRequest
       2

Выступление GROUP BY в Postgres

0 голосов
/ 22 февраля 2012

У меня большая таблица (2M + записи с множеством столбцов). Я намерен сделать GROUP BY для целей дедупликации. Я хотел бы знать, какая из следующих двух стратегий будет работать лучше?

  1. GROUP BY несколько столбцов (col_a, col_b, col_c)
  2. ДОБАВИТЬ новый столбец dedup_col, состоящий из нормализованной строки, сформированной с использованием col_a, col_b, col_c, а затем выполнить GROUP BY для dedup_col. Dedup_col будет заполнен заранее.

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

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Ради любви к Богу, перейдите к варианту 1. Не прибегайте к # 2, если у вас нет серьезных вариантов производительности с # 1, и вы исчерпали все другие варианты (включая индексацию), чтобы решить эту проблему.

Вариант № 2 - ужасная идея. По сути, вы заново изобретаете колесо, внедряя версию индекса для бедного человека ... плохо.

Никогда, никогда, никогда не нормализуйте (это то, что вы делаете в варианте 2) ваши данные для производительности, пока вы не выявите проблему с производительностью. Даже тогда вы, вероятно, не должны этого делать.

К вашему сведению: 2 миллиона записей НЕ являются большой базой данных, если ваши индексы настроены правильно.

3 голосов
/ 22 февраля 2012

Я бы запустил EXPLAIN PLAN для различных запросов, чтобы сравнить затраты.Это будет стоить больше, чем любой теоретический ответ, который вы получите здесь.Пусть PostgreSQL скажет вам, что он будет делать.

0 голосов
/ 22 февраля 2012

Метод, который я обычно использую для этого, заключается в использовании клавиши ctid.Например:

delete from yourtable
where ctid not in (
SELECT  MAX(dt.ctid)
FROM yourtable As dt
GROUP BY dt.col_a, dt.col_b, dt.col_c);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...