powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
6 сообщений из 6, страница 1 из 1
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39890848
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго!
Замечены медленные 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.
duration: 7787531.747 ms  
auto_explain: Output: id
          Conflict Resolution: NOTHING
          Tuples Inserted: 1
          Conflicting Tuples: 0
          Buffers: shared hit=206368703 read=34543375 dirtied=24218540 written=59587
          I/O Timings: read=6664788.861 write=561.247


повторный его запуск вместе с EXPLAIN ANALYZE:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(cost=0.00..0.01 rows=1 width=48) (actual time=0.164..0.164 rows=0 loops=1)
   Output: id
   Conflict Resolution: NOTHING
   Tuples Inserted: 0
   Conflicting Tuples: 1
   Buffers: shared hit=22
   ->  Result  (cost=0.00..0.01 rows=1 width=48) (actual time=0.049..0.049 rows=1 loops=1)
         Output: nextval('.....'::regclass), 70462327, 1, '''+1'':1030 ''-0.028 .......
.................................................................................................
3199,3209 ''zdownload'':2472 ''zeger'':1412,3144,3432,3455 ''zegerand'':1692 ''zero'':1104,1872 ''zhao'':1701 ''zp'':1127'::tsvector, 5
         Buffers: shared hit=13
 Planning Time: 8.566 ms
 Execution Time: 0.469 ms         



Судя по тому что он утилизирует SSD то проблема в индексах.
В чем может быть дело? вроде INSERT это-же запись, откуда тогда такое безобразие с чтением?
...
Рейтинг: 0 / 0
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39890929
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить - триггеров и правил на таблице нет.
...
Рейтинг: 0 / 0
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39890954
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 чтения).
...
Рейтинг: 0 / 0
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39891025
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Максим!

>PS:И да ssd какой то у вас сильно небыстрый (быстрые 2Gb/s дает а не 60Mb/s чтения).

угу, есть такое, виртуалка.
...
Рейтинг: 0 / 0
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39891028
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S.e.r.y.i,

если вам критична latency ровная на вставку а не максимальная скорость вставки - можно fast updates вообще отключить на gin индексе.
...
Рейтинг: 0 / 0
Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
    #39891051
S.e.r.y.i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, все верно, как вариант выставим turning off the fastupdate storage parameter for a GIN index в настройках индекса.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Медленный INSERT в таблицу >200млн с gin индексом и полем tsvector
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]