- Если
a
и b
имеют 1000 различных значений и всегда запрашиваются вместе, то порядок столбцов в индексе на самом деле не имеет значения.Но если a
имеет только 10 различных значений или у вас есть запросы, которые используют только один из столбцов, тогда это имеет значение;в этих сценариях индекс нельзя использовать, если порядок столбцов не соответствует запросу. - Столбец с наименее различающимися значениями должен быть первым, а столбец с наиболее различимыми значениями - последним.Это не только максимизирует полезность индекса, но и увеличивает потенциальные выгоды от сжатия индекса.
- Тип данных и длина столбца влияют на отдачу, которую мы можем получить от сжатия индекса, но не в лучшем порядкестолбцов в индексе.
- Расположите столбцы с наименее селективным столбцом первым и наиболее избирательным столбцом последним.В случае связующего провода с колонкой, которая, скорее всего, будет использоваться самостоятельно.
Единственное потенциальное исключение для 2. и 3. для столбцов DATE.Поскольку столбцы Oracle DATE содержат элемент времени, они могут иметь 86400 различных значений в день .Однако большинство запросов к столбцу данных обычно интересует только элемент дня, поэтому вам может потребоваться учитывать только количество отдельных дней в ваших вычислениях.Хотя я подозреваю, что это не повлияет на относительную избирательность в нескольких случаях.
edit (в ответ на комментарий Ника Пирпойнта)
Две основные причины для лидерства с наименее селективным столбцом:
- Сжатие индекса
- Индекс Пропустить читает
Оба они работают своим волшебством, зная, что значение в текущем слоте совпадает со значением в предыдущем слоте.Следовательно, мы можем максимизировать отдачу от этих методов, сводя к минимуму количество изменений значения.В следующем примере 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 для нескольких строк вряд ли будут перевешиваться из-за затрат на поддержку составного индекса.
Многостолбцовые индексы наиболее полезны, когда у нас есть:
- два или более столбцов средней селективности,
- , которые часто используются в одном запросе.