Советы и хитрости GIN
Создание или добавление
Вставка в индекс GIN может быть медленной из-за вероятности вставки многих ключей для каждого элемента. Поэтому при массовых вставках в таблицу рекомендуется отбросить индекс GIN и создать его заново после завершения массовой вставки.
Когда функция fastupdate
включена для GIN (подробности см. в разделе «Техника быстрого обновления GIN»), штраф меньше, чем в противном случае. Но для очень больших обновлений все же лучше отказаться от индекса и создать его заново.
maintenance_work_mem
Время создания индекса GIN очень чувствительно к параметру maintenance_work_mem
, не стоит экономить на рабочей памяти при создании индекса.
gin_pending_list_limit
Во время серии вставок в существующий индекс GIN, в котором включена функция fastupdate
, система будет очищать список ожидающих записей всякий раз, когда его размер превысит gin_pending_list_limit
. Чтобы избежать колебаний наблюдаемого времени отклика, желательно, чтобы очистка pending-списка происходила в фоновом режиме (т.е. с помощью autovacuum
). Операции очистки на переднем плане можно избежать, увеличив gin_pending_list_limit
или сделав автовакуум более агрессивным. Однако увеличение порога операции очистки означает, что если очистка в фоновом режиме все же произойдет, она займет еще больше времени.
gin_pending_list_limit
можно переопределить для отдельных индексов GIN, изменив параметры хранилища, что позволяет каждому индексу GIN иметь свой порог очистки. Например, можно увеличить порог только для индекса GIN, который может сильно обновляться, и уменьшить его в остальных случаях.
gin_fuzzy_search_limit
Основной целью разработки индексов GIN было создание поддержки высокомасштабируемого полнотекстового поиска в PostgreSQL, и часто возникают ситуации, когда полнотекстовый поиск возвращает очень большой набор результатов. Более того, это часто происходит, когда запрос содержит очень частые слова, так что большой набор результатов даже не является полезным. Поскольку чтение большого количества кортежей с диска и их сортировка могут занять много времени, это неприемлемо для производства. (Обратите внимание, что сам поиск по индексу выполняется очень быстро).
Чтобы облегчить контролируемое выполнение таких запросов, в GIN есть настраиваемый мягкий верхний предел на количество возвращаемых строк: конфигурационный параметр gin_fuzzy_search_limit
. По умолчанию он установлен в 0 (означает отсутствие ограничения). Если установлено ненулевое ограничение, то возвращаемый набор является подмножеством всего набора результатов, выбранным случайным образом.
«Мягкий» означает, что фактическое количество возвращаемых результатов может несколько отличаться от указанного предела, в зависимости от запроса и качества генератора случайных чисел системы.
По опыту, хорошо работают значения в тысячах (например, 5000 - 20000).