Запросы 1, 3 и 4 естественно используют левую часть B-tree. Для запроса только по Col2 возможность и выгодность зависят от СУБД и плана.
Как определить, какие запросы задействуют составной индекс
Запросы 1, 3 и 4 естественно используют левую часть B-tree. Для запроса только по Col2 возможность и выгодность зависят от СУБД и плана.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вопрос: какие из перечисленных запросов смогут воспользоваться созданным составным индексом?
CREATE INDEX IDX_Composite ON MyTable (Col1, Col2);
1. SELECT * FROM MyTable WHERE Col1 = 1;
2. SELECT * FROM MyTable WHERE Col2 = 2;
3. SELECT * FROM MyTable WHERE Col1 = 1 AND Col2 = 2;
4. SELECT * FROM MyTable WHERE Col2 = 2 AND Col1 = 1;
Разберите каждый запрос и укажите, использует ли он указанный индекс.
Ответ
Запросы 1, 3 и 4 естественно используют левую часть B-tree. Для запроса только по Col2 возможность и выгодность зависят от СУБД и плана.
Порядок условий в WHERE не меняет смысл, поэтому 3 и 4 эквивалентны для оптимизатора. Col1 первым в индексе позволяет искать непрерывный диапазон по этому полю, а Col2 уточняет его.
Категоричное «2 никогда не использует индекс» неверно: возможны сканирование индекса и, например, skip scan в PostgreSQL 18. Но при отсутствии условия на первый столбец это не обязательно выгодно. Наличие подходящего индекса не гарантирует его выбор: проверяйте EXPLAIN и статистику распределения данных.
Источник: www.postgresql.org.