Только представьте, какую ужасную производительность я получаю, сравнивая все строки со всеми другими строками несколько раз.
Когда вы делаете это некоторое время, вы перестаете воображать производительность, и выначать измерять это.«Преждевременная оптимизация - корень всего зла».
Что значит для вас "миллиард"?Для меня в США это означает 1 000 000 000 (или 1e9).Если это также верно для вас, вы, вероятно, просматриваете от 1 до 7 терабайт данных.
Мой текущий метод заключается в том, чтобы по существу выполнить следующий запрос для создания таблицы измерений:
Create table dimension_table (id int, text varchar(1000), primary key(id));
Как вы поместите 10 миллиардов строк в таблицу, которая используетцелое число для первичного ключа?Давайте даже скажем, что половина строк является дубликатами.Как работает эта арифметика, когда вы это делаете?
Не представляйте.Читай сначала.Затем проверьте.
Чтение Хранилище данных с PostgreSQL .Я подозреваю, что эти слайды презентации дадут вам некоторые идеи.
Также прочитайте Заполнение базы данных и подумайте, какие предложения следует реализовать.
Тест с миллионами (1e6) строк, следуя процессу «разделяй и властвуй».То есть не пытайтесь загрузить миллион за раз;написать процедуру, которая разбивает его на более мелкие куски.Выполните
EXPLAIN <sql statement>
Вы сказали, что оцениваете как минимум 99% повторяющихся строк.Вообще говоря, есть два способа избавиться от дубликатов
- Внутри базы данных, не обязательно той же платформы, которую вы используете для производства.
- За пределами базы данных, в файловой системе,не обязательно та же файловая система, которую вы используете для производства.
Если у вас все еще есть загруженные текстовые файлы, я бы сначала попробовал за пределами базы данных.Этот awk one-liner будет выводить уникальные строки из каждого файла.Это относительно экономично, так как он делает только один проход по данным.
awk '!arr[$0]++' file_with_dupes > file_without_dupes
Если у вас действительно есть 99% дупликов, к концу этого процесса вы должны были сократить свои от 1 до 7 терабайт до примерно50 концертов.И, сделав это, вы также можете нумеровать каждую уникальную строку и создавать файл с разделителями табуляции, прежде чем копировать его в хранилище данных.Это еще одна строка:
awk '{printf("%d\t%s\n", NR, $0);}' file_without_dupes > tab_delimited_file
Если вам нужно сделать это под Windows, я бы использовал Cygwin .
Если вы должны сделать это вбазы данных, я бы постарался избежать использования вашей производственной базы данных или вашего производственного сервераНо, может быть, я слишком остороженПеремещение нескольких терабайт вокруг - дорогая вещь.
Но я бы протестировал
SELECT DISTINCT ...
перед использованием GROUP BY.Я мог бы провести некоторые тесты для большого набора данных для вас, но, вероятно, не на этой неделе.(Я обычно не работаю с файлами размером в терабайты. Это довольно интересно. Если вы можете подождать.)