встречаются в индексе, то индекс используется. А если даю ему квери которая там не встречается, то он упорно делает сиквенс скан.
\d profile_name_index
Table "public.profile_name_index"
Column | Type | Collation | Nullable | Default
------------+---------+-----------+----------+------------------------------------------------
id | bigint | | not null | nextval('profile_name_index_id_seq'::regclass)
profile_id | integer | | not null |
name | text | | not null |
Indexes:
"profile_name_index_pkey" PRIMARY KEY, btree (id)
"profile_name_index_name_tsv_ix" gin (to_tsvector('russian'::regconfig, name))
"profile_name_index_profile_id_ix" btree (profile_id)
"profile_name_index_profile_name_uniq" UNIQUE CONSTRAINT, btree (profile_id, name)
Фигня:
SET enable_seqscan = off;
EXPLAIN SELECT
ix.name AS name
FROM profile_name_index ix
WHERE to_tsvector('russian'::regconfig, name) @@ websearch_to_tsquery('russian', 'wijefbwifwe')
LIMIT 20;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.57..1098.06 rows=20 width=26)
-> Index Only Scan using profile_name_index_profile_name_uniq on profile_name_index ix (cost=0.57..84203921.87 rows=1534488 width=26)
Filter: (to_tsvector('russian'::regconfig, name) @@ '''wijefbwifw'''::tsquery)
(3 rows)
Добавляем pkey в квери, индекс теперь используется как и надо:
SET enable_seqscan = off;
EXPLAIN SELECT
ix.id AS ix_id,
ix.name AS name
FROM profile_name_index ix
WHERE to_tsvector('russian'::regconfig, name) @@ websearch_to_tsquery('russian', 'wijefbwifwe')
LIMIT 20;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Limit (cost=12518.18..12539.41 rows=20 width=34)
-> Bitmap Heap Scan on profile_name_index ix (cost=12518.18..1640932.84 rows=1534488 width=34)
Recheck Cond: (to_tsvector('russian'::regconfig, name) @@ '''wijefbwifw'''::tsquery)
-> Bitmap Index Scan on profile_name_index_name_tsv_ix (cost=0.00..12134.56 rows=1534488 width=0)
Index Cond: (to_tsvector('russian'::regconfig, name) @@ '''wijefbwifw'''::tsquery)
(5 rows)
ПГ версии 14.2, вакум анализ все свежее.
Закреп: https://t.me/pgsql/303899 Во-первых, explain(analyze, buffers) -- для ВСЕХ запросов, скорость которых вы сравниваете. (Думаю, вы многое поймёте только из этого. Или не вы, а мы поймём.). Во-вторых, именно analyze и именно buffers. Для всех, кто вообще способен завершыться. Тут это менее важно, но в любом случае оставляет меньшэ простора для догадок.
Я бы с радостью показал и ио статы, но запрос не завершается(
Обсуждают сегодня