Я думал, что уже опубликовал это, но, видимо, он так и не появился. Отключение повторной проверки тривиально, если вы уже настроены на компиляцию расширений:
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)
. В некоторых случаях пропуск повторных проверок может также пропустить ввод-вывод, например, если вы только подсчитываете строки, а не получаете их.