Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Таблица связей: покрывающие индексы с INCLUDE или без ?  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1462
Редко изменяемая таблица, связывающая две другие таблицы (сущности предметной области) по типу М:М
И запросы, которые будут выполняться над этой таблицей (показаны без JOIN, но JOIN'ы будут с аналогичными условиями)
CREATE TABLE test (main_id int4 NOT NULL, rel_id int4 NOT NULL);
CREATE UNIQUE INDEX test_mr_idx  ON test USING btree (main_id, rel_id);        -- покрывающий индекс без INCLUDE
CREATE        INDEX test_rfm_idx ON test USING btree (rel_id, flag, main_id);  -- покрывающий индекс без INCLUDE

SELECT rel_id  FROM test WHERE (main_id = ...);
SELECT main_id FROM test WHERE (rel_id = ...);
SELECT main_id FROM test WHERE (rel_id = ...) AND (flag = ...);

Есть два варианта создания покрывающих индексов: без INCLUDE (показаны выше) и с INCLUDE:
CREATE UNIQUE INDEX test_mr_idx  ON test USING btree (main_id, rel_id);        -- ключ.индекс => остаётся без INCLUDE
CREATE INDEX test_rfm_idx ON test USING btree (rel_id, flag) INCLUDE (main_id);  -- покрывающий индекс с INCLUDE

(1) Какой из вариантов покрывающих индексов даст больший выигрыш в скорости JOIN-запросов на выборку ?
(при прочих равных условиях и при актуальном visibility map)

Согласно справке, в варианте без INCLUDE размер индекса может быть таким же, как в варианте с INCLUDE, а может быть и больше, чем в варианте с INCLUDE. При этом про скорость поиска по двум вариантам индекса там прямо не говорится. Тем не менее, очевидно, что чем меньше индекс, тем быстрее он обрабатывается. Т.е. если в варианте с INCLUDE размер индекса будет меньше, чем в варианте без INCLUDE, то скорость выборки будет выше (при прочих равных условиях).

(2) В связи с чем, возникает второй вопрос: для больших таблиц указанной структуры размер покрывающих индексов с INCLUDE будет меньше, чем без INCLUDE или таким же ? На таблице в 8000 записей размеры этих индексов получились одинаковыми (проверял после VACUUM FULL).
14 апр 21, 00:33    [22308532]     Ответить | Цитировать Сообщить модератору
 Re: Таблица связей: покрывающие индексы с INCLUDE или без ?  [new]
Cyrax_02
Member

Откуда:
Сообщений: 1462
На текущий момент:
1) Меньший размер индекса в варианте с INCLUDE не подтверждён.
2) Сигнатура текущих индексов является оптимальной как для указанных WHERE-запросов, так и для JOIN'ов, построенных в обоих направлениях.
16 апр 21, 11:28    [22309733]     Ответить | Цитировать Сообщить модератору
 Re: Таблица связей: покрывающие индексы с INCLUDE или без ?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
Cyrax_02,

Смысла в неуникальных индексах с INCLUDE никогда и не предполагалось.
INCLUDE он для unique(a) include (b) и подобных случаев предназначен by design.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
16 апр 21, 12:08    [22309759]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить