Производительность Oracle с несколькими одинаковыми индексами столбцов - PullRequest
5 голосов
/ 20 июня 2009

Я работаю с новой базой данных Oracle, у одной таблицы которой есть следующие индексы:

  • Индекс 1: ColA, ColB
  • Индекс 2: ColA

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

Ответы [ 4 ]

5 голосов
/ 02 июля 2009

Google мой лучший друг:

http://www.orafaq.com/node/926

Суть этой статьи:

If 2 indexes ( I1 and I2 ) exist for a table and
   the number of columns in Index I1 is less or equal to the number of column in index I2 and
   index I1 has the same columns in the same order as leading columns of index I2 
Then
   If index I1 is UNIQUE then
      If index I2 is used to support Foregh Key or for Index Overload then
         Do Nothing
      Else
         Index I2 can be DROPPED
      End If
   Else
      Index I1 can be DROPPED
   End If
End If

И я согласен с этим! На самом деле, ищите «двойные индексы» в Google, чтобы получить различный ответ.

2 голосов
/ 05 августа 2009

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

Как насчет этого запроса:

SELECT DISTINCT ColA FROM TABLE WHERE ColA IS NOT NULL;

Oracle может полностью ответить на этот вопрос из индекса 2. Теперь ожидается, что индекс 2 будет меньше (меньше блоков), чем индекс 1. Это означает, что это лучший индекс для вышеуказанного запроса.

Если ваше приложение никогда не выполняет запрос, который больше подходит для Index2, чем для Index1, тогда он является избыточным для вашего приложения.

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

Это более чем компенсируется повышенной производительностью, обеспечиваемой индексом? Зависит от вашего приложения и использования данных.

1 голос
/ 20 июня 2009

есть вероятность, что если ваша статистика устареет, оптимизатор может выбрать индекс 2, когда нужен индекс 1. (подсказка оптимизатору это решит, конечно.)

1 голос
/ 20 июня 2009

Второй индекс является своего рода избыточным - любая операция, использующая Index2, может использовать Index 1. Кроме того, запись будет выполняться немного медленнее, поскольку существует другой индекс для обновления.

Тем не менее, Index2 не является полностью избыточным, поскольку он может быть немного быстрее, поскольку сам индекс, вероятно, будет значительно меньше.

...