68.5. Советы и хитрости по GIN#

68.5. Советы и хитрости по GIN

68.5. Советы и хитрости по GIN

Create vs. insert

Вставка в индекс GIN может быть медленной из-за вероятности вставки множества ключей для каждого элемента. Поэтому, для массовых вставок в таблицу рекомендуется удалить индекс GIN и создать его заново после завершения массовой вставки.

Когда fastupdate включен для GIN (см. Раздел 68.4.1 для получения более подробной информации), штраф меньше, чем когда он отключен. Но для очень больших обновлений может быть лучше удалить и создать индекс заново.

maintenance_work_mem

Время сборки индекса GIN очень чувствительно к настройке maintenance_work_mem; не стоит экономить на рабочей памяти во время создания индекса.

gin_pending_list_limit

Во время серии вставок в существующий индекс GIN, включенный fastupdate, система будет очищать список ожидающих записей, когда этот список станет больше, чем gin_pending_list_limit. Чтобы избежать колебаний во времени отклика, желательно, чтобы очистка списка ожидающих записей происходила в фоновом режиме (т.е. с помощью автоочистки). Операции очистки в переднем плане можно избежать, увеличив gin_pending_list_limit или сделав автоочистку более агрессивной. Однако увеличение порога операции очистки означает, что если все же произойдет очистка в переднем плане, она займет еще больше времени.

gin_pending_list_limit может быть переопределен для отдельных GIN-индексов путем изменения параметров хранения, что позволяет каждому GIN-индексу иметь свой собственный порог очистки. Например, возможно увеличить порог только для GIN-индекса, который может быть часто обновляемым, и уменьшить его в остальных случаях.

gin_fuzzy_search_limit

Основная цель разработки индексов GIN заключалась в создании поддержки высокомасштабируемого полнотекстового поиска в Tantor SE, и часто возникают ситуации, когда полнотекстовый поиск возвращает очень большой набор результатов. Более того, это часто происходит, когда запрос содержит очень часто встречающиеся слова, так что большой набор результатов даже не полезен. Поскольку чтение множества кортежей с диска и их сортировка может занять много времени, это неприемлемо для производства. (Обратите внимание, что сам поиск по индексу очень быстрый).

Для облегчения контролируемого выполнения таких запросов, GIN имеет настраиваемый мягкий верхний предел на количество возвращаемых строк: параметр конфигурации gin_fuzzy_search_limit. По умолчанию он установлен в 0 (что означает отсутствие ограничения). Если установлено ненулевое значение предела, то возвращаемое множество является подмножеством всего результирующего множества, выбранным случайным образом.

Soft означает, что фактическое количество возвращаемых результатов может немного отличаться от указанного лимита, в зависимости от запроса и качества генератора случайных чисел системы.

Из опыта, значения в тысячах (например, 5000 — 20000) работают хорошо.