Oracle: имеет ли значение порядок столбцов в индексе? - PullRequest
22 голосов
/ 04 февраля 2010

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

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

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

  3. На (1) или (2) влияют типы / размеры столбцов?

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

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

Ответы [ 4 ]

22 голосов
/ 04 февраля 2010
  1. Если a и b имеют 1000 различных значений и всегда запрашиваются вместе, то порядок столбцов в индексе на самом деле не имеет значения.Но если a имеет только 10 различных значений или у вас есть запросы, которые используют только один из столбцов, тогда это имеет значение;в этих сценариях индекс нельзя использовать, если порядок столбцов не соответствует запросу.
  2. Столбец с наименее различающимися значениями должен быть первым, а столбец с наиболее различимыми значениями - последним.Это не только максимизирует полезность индекса, но и увеличивает потенциальные выгоды от сжатия индекса.
  3. Тип данных и длина столбца влияют на отдачу, которую мы можем получить от сжатия индекса, но не в лучшем порядкестолбцов в индексе.
  4. Расположите столбцы с наименее селективным столбцом первым и наиболее избирательным столбцом последним.В случае связующего провода с колонкой, которая, скорее всего, будет использоваться самостоятельно.

Единственное потенциальное исключение для 2. и 3. для столбцов DATE.Поскольку столбцы Oracle DATE содержат элемент времени, они могут иметь 86400 различных значений в день .Однако большинство запросов к столбцу данных обычно интересует только элемент дня, поэтому вам может потребоваться учитывать только количество отдельных дней в ваших вычислениях.Хотя я подозреваю, что это не повлияет на относительную избирательность в нескольких случаях.

edit (в ответ на комментарий Ника Пирпойнта)

Две основные причины для лидерства с наименее селективным столбцом:

  1. Сжатие индекса
  2. Индекс Пропустить читает

Оба они работают своим волшебством, зная, что значение в текущем слоте совпадает со значением в предыдущем слоте.Следовательно, мы можем максимизировать отдачу от этих методов, сводя к минимуму количество изменений значения.В следующем примере 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 для нескольких строк вряд ли будут перевешиваться из-за затрат на поддержку составного индекса.

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

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

Но, по словам самого Oracle, лучше поставить столбец с наивысшим количеством элементов первым:

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

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

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

4 голосов
/ 04 февраля 2010
3 голосов
/ 04 февраля 2010
  1. если в запросе используется один столбец, Oracle будет использовать менее эффективный путь доступа к индексу пропуска сканирования, если он не является ведущим столбцом в индексе
  2. зависит от соответствующей селективности столбцов
  3. нет
  4. Я бы посмотрел на запросы, включающие столбцы в индексе, и оценил их позицию в индексе по наиболее часто запрашиваемым
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...