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

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

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

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

  3. Или (1) или (2) затронуты типами/размерами столбцов?

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

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

22
задан Mark Harrison 4 February 2010 в 00:12
поделиться

3 ответа

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

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

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

Двумя основными причинами для начала с наименее избирательным столбцом являются

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

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

  • два или более столбца средней избирательности,
  • которые часто используются в одном запросе.
23
ответ дан 29 November 2019 в 05:03
поделиться
  1. , если столбец используется отдельно в запросе, Oracle будет использовать менее эффективный путь доступа к индексу с пропуском сканирования , если он не является ведущим столбцом в индексе
  2. зависит от соответствующей селективности столбцов
  3. нет
  4. Я бы посмотрел на запросы, включающие столбцы в индексе, и ранжировал их положение в индексе наиболее часто запрашиваемым
3
ответ дан 29 November 2019 в 05:03
поделиться
4
ответ дан 29 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: