|
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
|
|||
---|---|---|---|
#18+
Доброго! Замечены медленные INSERT в большую таблицу >200млн записей с gin индексом и полем TSVECTOR. Размер таблицы ~500GB размер gin индекса 179GB. Кроме gin есть еще 4 индекса, один PK и еще один уникальный и 2 простых, все индексы по integer и тип btree. Сервер ОЗУ 48GB 16 ядер, shared_buffers=25% PostgreSQL 11.5 (Debian 11.5-1+deb10u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit таблица лежит на HDD все индексы на SSD. Примерно 60tps быстрых INSERT (5-20 млсек) в эту таблицу и на фоне этой нагрузки всегда висит один (всегда только один) долгий INSERT (1-2-3 часа), sql которого ничем не отличается(~3600 слов в поле для tsvector вес запроса 23КБт) от быстрых, повторное выполнение медленного INSERT проходит пулей (5-10 млсек). При этом все время наблюдается высокая утилизация на чтение SSD ~80% Судя по iotop процесс с медленным INSERT в TOP и убивает ssd на чтение примерно 60MB/per sec. медленный INSERT в логе после выполнения: Код: sql 1. 2. 3. 4. 5. 6. 7.
повторный его запуск вместе с EXPLAIN ANALYZE: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Судя по тому что он утилизирует SSD то проблема в индексах. В чем может быть дело? вроде INSERT это-же запись, откуда тогда такое безобразие с чтением? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 00:23 |
|
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
|
|||
---|---|---|---|
#18+
Забыл добавить - триггеров и правил на таблице нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 10:25 |
|
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
|
|||
---|---|---|---|
#18+
S.e.r.y.i, Дело в https://www.postgresql.org/docs/12/gin-tips.html gin_pending_list_limit During a series of insertions into an existing GIN index that has fastupdate enabled, the system will clean up the pending-entry list whenever the list grows larger than gin_pending_list_limit. To avoid fluctuations in observed response time, it's desirable to have pending-list cleanup occur in the background (i.e., via autovacuum). Foreground cleanup operations can be avoided by increasing gin_pending_list_limit or making autovacuum more aggressive. However, enlarging the threshold of the cleanup operation means that if a foreground cleanup does occur, it will take even longer. gin_pending_list_limit can be overridden for individual GIN indexes by changing storage parameters, and which allows each GIN index to have its own cleanup threshold. For example, it's possible to increase the threshold only for the GIN index which can be updated heavily, and decrease it otherwise. Поставьте его системно в небольшое значение типа 1MB (или даже 256kb) и за счет замедления в среднем - не будет долгих inserts. PS:И да ssd какой то у вас сильно небыстрый (быстрые 2Gb/s дает а не 60Mb/s чтения). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 11:03 |
|
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
|
|||
---|---|---|---|
#18+
Спасибо Максим! >PS:И да ssd какой то у вас сильно небыстрый (быстрые 2Gb/s дает а не 60Mb/s чтения). угу, есть такое, виртуалка. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 13:03 |
|
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
|
|||
---|---|---|---|
#18+
S.e.r.y.i, если вам критична latency ровная на вставку а не максимальная скорость вставки - можно fast updates вообще отключить на gin индексе. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 13:05 |
|
|
start [/forum/topic.php?fid=53&msg=39890848&tid=1994933]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 119ms |
0 / 0 |