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