таблицу и льем в нее 100 гб данных
CREATE TABLE IF NOT EXISTS svjul
(
id bigint NOT NULL DEFAULT nextval('svjul_id_seq'::regclass),
startdate date NOT NULL DEFAULT '-infinity'::date,
enddate date,
data jsonb,
CONSTRAINT svjul_pkey PRIMARY KEY (id)
)
-- ставим расширения
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS btree_gin;
-- стром индекс
DROP INDEX IF EXISTS idx_gin_svjulv1_ltrim_id_inn;
CREATE INDEX IF NOT EXISTS idx_gin_svjul_ltrim_id_inn ON svjul USING gin (id, ltrim(data ->> 'INN') gin_trgm_ops);
-- выполняем запрос
SELECT * FROM svjul WHERE ltrim(data ->> 'INN') ilike '7839074221%' ORDER BY id ASC LIMIT 20 OFFSET 0;
Запрос вместо того, чтобы применить idx_gin_svjul_ltrim_id_inn строит svjul_pkey пока есть order by id. Как добиться, чтобы запрос применял индекс, не меняя текст запроса и структуру таблицы?
Выкинуть id из индэкса, поскольку алгоритмов чтобы пытаться скрестить триграммы и ORDER по какому-то полю в постгресе нет. А, да, если запросы только на начало этого INN — то ещё и на триграммы забить, банальный btree индэкс COLLATION "C" сработает лучшэ.
Обсуждают сегодня