powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса с gist-индексом
2 сообщений из 2, страница 1 из 1
оптимизация запроса с gist-индексом
    #39942127
deadka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, коллеги,

есть таблица (привожу необходимый минимум данных)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE public.t(
  id integer NOT NULL DEFAULT nextval('t_seq'::regclass),
  manufacturer_id integer,
  name character varying(256) NOT NULL,  
  CONSTRAINT t_pkey PRIMARY KEY (id)
);

CREATE INDEX "6ca70c50a143165402024556c3fd94a9"  ON public.t  USING btree  (manufacturer_id);

CREATE INDEX "725066c0025d25c8817470aed188bbee"  ON public.t  USING btree  (name COLLATE pg_catalog."default");

CREATE INDEX t_name_trgm  ON public.t  USING gist  (name COLLATE pg_catalog."default" gist_trgm_ops);


postgre 9.5, linux,
в таблице около миллиона записей,
на каждый manufacturer_id приходится от 1 до 100,000 записей,
записей где manufacturer_id is null в таблице не имеется.

В приложении очень часто запускается запрос вида

Код: plsql
1.
SELECT * FROM "t" WHERE  manufacturer_id = КАКОЙ_ТО_АЙДИ and "name" % 'КАКОЕ_ТО_СЛОВО';



метрики показывают, что он ест очень много ресурсов, если можно его как-то ускорить, то лучше это сделать.

Копал в направлении создании двухстолбцового индекса на связку (manufacturer_id, "name"), но не нашёл способа
создать индекс, где половинка будет BTREE-шная (на manufacturer_id), а половинка - GIST'овая.

Сам explain сейчас выглядит

"Bitmap Heap Scan on t (cost=200.73..204.75 rows=1 width=594)"
" Recheck Cond: ((manufacturer_id = 1) AND ((name)::text % 'SANTEK'::text))"
" -> BitmapAnd (cost=200.73..200.73 rows=1 width=0)"
" -> Bitmap Index Scan on "6ca70c50a143165402024556c3fd94a9" (cost=0.00..6.53 rows=280 width=0)"
" Index Cond: (manufacturer_id = 1)"
" -> Bitmap Index Scan on ref_nomenclature_name_trgm (cost=0.00..193.95 rows=1272 width=0)"
" Index Cond: ((name)::text % 'SANTEK'::text)"

Прошу подсказать знающих следующее:

1) Можно ли создать индекс на связку двух полей (что я выше указывал), если можно, то как?
И нужно ли?

2) Правильно ли я понимаю, что сейчас используются оба индекса в запросе?

3) Каковы (если есть) best practices на такого рода задачу? Или не best - в общем, прошу инфы.
...
Рейтинг: 0 / 0
оптимизация запроса с gist-индексом
    #39942131
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
deadka,

Код: sql
1.
CREATE EXTENSION btree_gist;
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса с gist-индексом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]