Индексация идёт уже 2 недели, в чем у меня ошибка?

Заливаю дамп PostgreSQL в PG14.
Размер дампа 60GB.
В дампе 25 таблиц.
В каждой таблице от 1 до 7 индексов.
В одном из мест используется составной индекс.
Несколько индексов хэши -- остальные btree

Максимальный размер одной из таблиц около 100 млн записей.

Проблема в том, что индексация идёт уже 14 дней и судя по pg_stat_progress_create_index будет идти еще дней 15.

Вроде все конфиги которые могут повлиять на скорость индексации я подкрутил (перед запуском заливки).

Сервер Xeon 6 ядер. 16GB RAM.

Диск HDD. Данные загрузились за 5 часов.
Индексы создаются синхронно.
Процессор почему-то загружен только на 25%.
ОС Windows.

Конфиг: pastie.org/p/585DJwfj6rstQwukSQjhtT
  • Вопрос задан
  • 1575 просмотров
Решения вопроса 1
@rPman
значит узкое место почти наверняка диск.

Пальцем в небо, файловая система на которой таблеспейсы лежат какая? случайно не cow (btrfs/zfs/xfs)? с ними отвратительно работают базы данных, так как частые записи в файл генерируют сильную фрагментацию. В этом случае перед тяжелой обработкой хотя бы дефрагментируй файлы базы и отключи cow фичу на таблеспейсах

неплохим тюнингом может оказаться (на выбор):
* разместить базу в ram диске (буквально, залить на сервер в облаке, обработать данные, залить назад, работая напрямую с таблеспейсами, но версия софта должна совпадать до последней цифры)
* разместить базу целиком на ssd (даже если это будет потребительский и дешевый)
* добавить в систему ssd кеш для hdd с помощью например bcache (включенный на запись), правда для линейной обработки базы это может дать мало пользы, но вообще это неплохой способ на порядок поднять производительность за дешево (в одном месте я использовал фичу virtualbox со снапшотами в файл, есть и у kvm, когда последующие записи шли не на исходный образ а на другой диск, и он ssd)
* разместить таблеспейс для индексов (а может и каждую таблицу отдельно) на другом физическом устройстве (hdd, ssd или даже в ram), требования к размеру тут обычно низкие, ключевое слово - исключить последовательные чтения/записи на одно устройство.
* разместить журнал (например ext4) на ssd диск (хватит пары гигабайт) или по хардкору даже отключить его (очень опасно, можно получить кашу из данных при сбое питания, но как временное решение пока идет долгая операция, при наличии всех бакапов, оправдано) - наименьшая оптимизация, но при частых мелких записях это заметно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы