порядок столбцов индекса столбца - PullRequest
4 голосов
/ 24 ноября 2010

Мне сказали и читали везде (но никто не осмеливался объяснять почему), что при составлении индекса по нескольким столбцам я должен ставить самый выборочный столбец первым, из соображений производительности.Это почему?Это миф?

Ответы [ 4 ]

6 голосов
/ 24 ноября 2010

Я должен поставить самый селективный столбец первым

Согласно Тому избирательность столбцов не влияет на производительность для запросов, которые используют все столбцы в индексе (это влияет на способность Oracle сжимать индекс).

это не первое, это не самое главное.конечно, это то, что нужно учитывать, но это относительно далеко внизу в общей схеме вещей.

В некоторых странных, очень своеобразных и ненормальных случаях (как, например, выше с действительно сильно искаженными данными), избирательность можетлегко иметь значение ОДНАКО, они

а) довольно редко б) действительно зависят от значений, используемых во время выполнения, так как все искаженные запросы

, так что в общем, посмотрите на ваши вопросы, попробуйтечтобы минимизировать индексы, которые вам нужны, основываясь на этом.

Количество различных значений в столбце в объединенном индексе не имеет значения при рассмотрении позиции в индексе.

Однако эти соображения должны стоять на втором месте при выборе столбца индексапорядок.Более важно убедиться, что индекс может быть полезен для многих запросов, поэтому порядок столбцов должен отражать использование этих столбцов (или их отсутствие) в предложениях where ваших запросов (по причине, показанной AndreKR).

КАК ВЫ ИСПОЛЬЗУЕТЕ индекс - это то, что имеет значение при принятии решения.

При прочих равных условиях я бы по-прежнему поставил наиболее селективный столбец первым.Он просто чувствует себя хорошо ...

Обновление: Еще одна цитата от Тома (спасибо Милану за его поиск).

InВ Oracle 5 (да, версия 5!) Был аргумент для размещения наиболее селективных столбцов сначала в индексе.

С тех пор неверно, что размещение самых различающих записей в индексе будет первыминдекс меньше или эффективнее.Кажется, что так и будет, но не будет.

При сжатии ключа индекса есть веский аргумент, чтобы пойти другим путем, так как он может уменьшить индекс.Однако это должно зависеть от того, как вы используете индекс, как указано ранее.

6 голосов
/ 24 ноября 2010

Вы можете опустить столбцы справа налево при использовании индекса, т.е. когда у вас есть индекс на col_a, col_b, вы можете использовать его в WHERE col_a = x, но вы не можете использовать его в WHERE col_b = x.

Представьте себе телефонную книгу, которая сортируется по именам , а затем по фамилиям.

По крайней мере, в Европе и США имена имеют гораздо более низкую избирательность, чем фамилии,поэтому поиск имени не сузил бы результирующий набор, поэтому было бы много страниц, чтобы проверить правильность фамилии.

2 голосов
/ 24 ноября 2010

Порядок столбцов в индексе должен определяться вашими запросами, а не какими-либо соображениями избирательности. Если у вас есть индекс для (a, b, c), и большинство ваших запросов в одном столбце относятся к столбцу c, за которым следует a, то поместите их в порядке c, a, b в определении индекса для лучшей эффективности. , Oracle предпочитает использовать передний край индекса для запроса, но может использовать другие столбцы в индексе в менее эффективном пути доступа, известном как skip-scan.

1 голос
/ 24 ноября 2010

Чем более избирателен ваш индекс, тем быстрее исследование.

Просто представьте себе телефонную книгу: вы можете найти кого-то, в основном, быстро по фамилии. Но если у вас много людей с одинаковой фамилией, вам придется больше искать человека, каждый раз просматривая его имя.

Таким образом, вы должны сначала дать наиболее избирательные столбцы, чтобы как можно больше избежать этой проблемы.

Кроме того, вам следует убедиться, что ваши запросы правильно используют эти «критерии избирательности».

...