Индекс на двух столбцах может быть создан с любым из операторов
create index foo_ix on foo(a,b);
create index foo_ix on foo(b,a);
Как это влияет на операционные характеристики (во время выполнения) использования индекса?
Как это влияет на расположение (физические) характеристики индекса?
Или (1) или (2) затронуты типами/размерами столбцов?
Каковы лучшие практики для создания многостолбцовых индексов?
Короче говоря, это имеет значение, какой столбец я поместил сначала?
a
и b
оба имеют 1000 различных значений и они всегда запрашиваются вместе, то порядок столбцов в индекс на самом деле не имеет значения.Но если a
имеет только 10 различных значений или у вас есть запросы, которые используют только один из столбцов, тогда это имеет значение; в этих сценариях индекс может не использоваться, если порядок столбцов не соответствует запросу. Единственное возможное исключение для 2. и 3. - столбцы DATE. Поскольку столбцы Oracle DATE содержат элемент времени, они могут иметь 86400 различных значений в день . Однако большинство запросов к столбцу данных обычно интересуют только элемент дня, поэтому в расчетах может потребоваться учитывать только количество отдельных дней. Хотя я подозреваю, что это не повлияет на относительную избирательность лишь в некоторых случаях.
редактировать (в ответ на комментарий Ника Пирпойнта)
Двумя основными причинами для начала с наименее избирательным столбцом являются
Оба они творит чудеса, зная, что значение в текущем слоте совпадает со значением в предыдущем слоте.Следовательно, мы можем максимизировать отдачу от этих методов, сводя к минимуму количество изменений стоимости. В следующем примере A
имеет четыре различных значения, а B
- шесть. То же самое представляет собой сжимаемое значение или блок индекса с возможностью пропуска.
Least selective column leads ...
A B
--------- -
AARDVARK 1
" 2
" 3
" 4
" 5
" 6
DIFFVAL 1
" 2
" 3
" 4
" 5
" 6
OTHERVAL 1
" 2
" 3
" 4
" 5
" 6
WHATEVER 1
" 2
" 3
" 4
" 5
" 6
Наиболее избирательные ведущие столбцы ...
B A
- --------
1 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
2 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
3 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
4 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
5 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
6 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
Даже в этом тривиальном примере (A, B)
имеет 20 пропускаемых слотов по сравнению с 18 из (B, A)
. Более широкое несоответствие приведет к большей рентабельности инвестиций при сжатии индекса или более высокой полезности чтения с пропуском индекса.
Как и в случае с большинством эвристических методов настройки, нам необходимо выполнить эталонное тестирование, используя фактические значения и реалистичные объемы. Это, безусловно, сценарий, при котором перекос данных может существенно повлиять на эффективность различных подходов.
«Я думаю, что если у вас есть высокоселективный первый индекс, то - с точки зрения производительности - вам стоит поставить его первым».
Если у нас есть высокоселективный столбец, то нам следует создать собственный индекс. Дополнительные преимущества отказа от операции FILTER для небольшого количества строк вряд ли будут перевешены накладными расходами на поддержку составного индекса.
Многоколоночные индексы наиболее полезны, когда у нас есть:
Вы можете найти ответы на некоторые из своих вопросов здесь: Сканирование с пропуском индекса - имеет ли значение порядок столбцов индекса? (Предупреждающий знак)