Отключить перепроверку в индексе trgm - PullRequest
1 голос
/ 05 мая 2020

У нас есть столбец postgres, в котором используется индекс триграмм (pg_trgm).

Индекс работает хорошо, но ОЧЕНЬ медленно: последняя повторная проверка на ложные срабатывания занимает> 99% общего времени запроса ( сканирование индекса битовой карты 0,25 с; перепроверьте 30,7 с).

В нашем случае ложные срабатывания не имеют значения (редко + нам все равно), поэтому перепроверка бесполезна.

Есть ли как отключить / отключить шаг повторной проверки, чтобы пропустить проверку ложных срабатываний? Как лучше всего это сделать?

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Я думал, что уже опубликовал это, но, видимо, он так и не появился. Отключение повторной проверки тривиально, если вы уже настроены на компиляцию расширений:

diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c
index 4dbf0ffb68..a23855cad5 100644
--- a/contrib/pg_trgm/trgm_gin.c
+++ b/contrib/pg_trgm/trgm_gin.c
@@ -307,7 +307,7 @@ gin_trgm_triconsistent(PG_FUNCTION_ARGS)
            /* FALL THRU */
        case LikeStrategyNumber:
            /* Check if all extracted trigrams are presented. */
-           res = GIN_MAYBE;
+           res = GIN_TRUE;
            for (i = 0; i < nkeys; i++)
            {
                if (check[i] == GIN_FALSE)

Конечно, это даст вам неправильные ответы, с которыми вы, похоже, согласны. Однако ваши коллеги, настоящие или будущие, могут быть удивлены этим, особенно если они используют pg_trgm в каком-то контексте, отличном от текущего. Так что это должно быть где-то четко задокументировано. Вы можете включить pg_trgm в новое расширение и внести в него изменения, но это потребует довольно утомительного переименования функций и операторов, чтобы они не конфликтовали. Возможно, лучшим вариантом было бы создать новую версию pg_trgm, в которой есть дополнительный оператор, который реализует эту функцию без повторной проверки, оставляя ~~ (вещь LIKE - псевдоним) делать то, что он делает в настоящее время. Тем не менее, это все равно будет представлять опасность при обновлении.

Кроме того, я сомневаюсь, что это действительно сделает вещи намного быстрее. Вероятно, время фактически тратится на ввод-вывод на столе, а не на перепроверки. Вы можете проверить это, включив track_io_timing и выполнив EXPLAIN (ANALYZE, BUFFERS). В некоторых случаях пропуск повторных проверок может также пропустить ввод-вывод, например, если вы только подсчитываете строки, а не получаете их.

1 голос
/ 05 мая 2020

AFAIK вы не можете отключить шаг перепроверки, но вы можете попробовать уменьшить количество перепроверок, увеличив параметр work_mem в текущем сеансе.

...