|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
Уважаемые Postgres-гуру, Прошу помочь с проблемой. Есть база, есть в ней таблица, которую требуется периодически чистить. Если чистить аккуратно, то проблем не возникает. Однако, возможны ситуации, когда по недосмотру задание очистки перестало запускаться, и заметили мы это поздно, когда в таблице скопилось число записей, которое там не должно скапливаться. Нужно переписать скрипт очистки так, чтобы за ночь худо-бедно, но удалились много (несколько миллионов) записей. Вдохновленный благородными планами, я начал писать скрипт на Python, который запускает хранимую процедуру удаления некой порции (скажем, 32К) записей, после чего выдает COMMIT, потом удаляет следующую порцию, COMMIT, и так далее, пока все записи, которые нужно удалять, не будут удалены. Отметим: удалить следует не все записи, и вполне возможна ситуация, когда количества удаляемых и сохраняемых записей могут быть примерно одинаковы. Так что варианты с TRUNCATE или перекачкой в новую таблицу и DROP'ом старой не пройдут. В начале я стал любоваться на то, как расправляется написанный скрипт с порциями, докладывая, что время, пошедшее на порцию, равно 2..4 сек., но потом после 400-500 порций время стало расти в 10 и более раз, и к концу процесса возросло в 100 раз. Это означает примерно следующее: после приблизительно 13-14 миллионов записей производительность резко упала. Средний размер записи ~250 байт. Опыта в настройке и/или DBA-сопровождению postgresql почти нет. Поковырялся в параметрах postgresql.conf, изменяя значения памяти, вынес директорию stats_temp_directory на RAM-диск. Ситуация качественно почти не меняется. Чувства подсказывают, что что-то не то с настройкой WAL и сбросом его сегментов в файлы БД. Не подскажете, что может быть причиной таких тормозов? Куда копать? Что читать... Заранее благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 18:11 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
eog_proon, Определение таблиц, код процедур в студию. Первое предположение: удаляешь полньім сканированием, поєтому найти первьіе 32к записей бьістрее, чем последующие (2-й раз надо просмотреть 2*32к записей, n-ьій раз - n*32к записей, ведь удаленньіе строки на самом деле никуда не деваются, а просто отмечаются удаленньіми). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:02 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
Ставлю на то, что ТС-а спасет VACUUM. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:51 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
Для истории решения проблемы: 1) Автовакуум не помогал. 2) Вакуум не помог (Вакуум был настроен на каждые 50 порций) 3) Оказалось, что в таблице есть bytea-поле 4) Переделали на vacuum full, (каждые 50 порций), замедление в конце ушло. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 14:18 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
Интересно. С одной стороны авторТак что варианты с TRUNCATE или перекачкой в новую таблицу и DROP'ом старой не пройдут. с другой -- vaccum full, который, по данным моей разведки, делает именно перекачку из одного места в другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 14:54 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
автор. плюс индексы еще не забудьте ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 17:19 |
|
Умеет ли PostgreSQL удалять 20 миллионов записей?
|
|||
---|---|---|---|
#18+
Alexander A. SakИнтересно. С одной стороны авторТак что варианты с TRUNCATE или перекачкой в новую таблицу и DROP'ом старой не пройдут. с другой -- vaccum full, который, по данным моей разведки, делает именно перекачку из одного места в другое. плюс индексы ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 17:19 |
|
|
start [/forum/search_topic.php?author=mvici&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
16ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 1118ms |
total: | 1320ms |
0 / 0 |