Перейти к основному содержимому

Советы и хитрости 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).