Подтвердить что ты не робот

Oracle: имеет ли значение столбца значение в индексе?

Индекс двух столбцов может быть создан с помощью любого из операторов

create index foo_ix on foo(a,b);
create index foo_ix on foo(b,a);
  • Как это влияет на эксплуатационные (рабочие параметры) использования индекса?

  • Как это влияет на макетные (физические) характеристики индекса?

  • Являются ли (1) или (2) затронуты типами/размерами столбцов?

  • Каковы наилучшие методы создания многоколоночных индексов?

Короче говоря, имеет значение, какой столбец я поставил первым?

4b9b3361

Ответ 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 на нескольких строках, вряд ли перевешиваются накладными расходами на поддержание составного индекса.

Многоколоночные индексы наиболее полезны, если у нас есть:

  • два или более столбца средней селективности,
  • которые часто используются в одном запросе.

Ответ 2

Но согласно самому Oracle, лучше сначала поставить столбец с наивысшей мощностью:

http://docs.oracle.com/cd/B10500_01/server.920/a96533/data_acc.htm#2174

Заказ ключей для составных индексов

Если все ключи используются в предложениях WHERE одинаково часто, то упорядочение этих ключей от большинства выборочных до наименьших выборок в инструкции CREATE INDEX лучше всего повышает производительность запросов.

Ответ 3

  • если столбец используется один   запрос Oracle будет использовать меньше   эффективный доступ к индексу сканирования   путь, если он не является ведущим столбцом   в индексе
  • зависит от   соответствующей селективности   столбцы
  • нет
  • Я бы посмотрел на запросы, связанные с столбцами в индексе, и оценил их позицию в индексе наиболее часто запрашиваемыми