Понимание ситуации с несколькими перекрывающимися индексами в Oracle - PullRequest
4 голосов
/ 18 августа 2010

С учетом следующих индексов для базы данных Oracle:

CREATE INDEX subject_x1 ON subject (code);
CREATE INDEX subject_x2 ON subject (code, status);

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

Любая документация оракула, объясняющая или подтверждающая это, будет очень полезна.

1 Ответ

12 голосов
/ 18 августа 2010

Как и в большинстве вопросов с базой данных, это зависит от: -)

На самом деле его нельзя удалять при всех обстоятельствах. Если у вас есть запрос, который использует только code в предложении where, возможно, что использование subject_x1 все равно будет превосходить subject_x2 только потому, что нужно будет прочитать меньше данных индекса.

Крайний пример, скажем, что code - это char(2), а status - это символ (4094) `. Если у вас есть запрос:

select code from tbl where code > 'dd' and code < 'gg';

Скорее всего, это приведет к сканированию только по индексу, поскольку нет абсолютно никакой причины переходить к таблице. Если вы используете subject_x1 и читаете в 4K-блоках из своего индекса, вы можете вводить пару тысяч кодов при каждом чтении.

Используя subject_x2, каждое чтение дает вам только один код (и, возможно, потерянный статус). Это огромная разница в производительности.

Однако, и я не могу подчеркнуть это достаточно, Мера, не угадай!

Профилируйте ваши запросы (и обновления), используя оба индекса, чтобы увидеть, какие из них работают лучше, и делать это с репрезентативными данными. Если вы обнаружите, что subject_x1 дает вам лучшую производительность для некоторых запросов, оставьте это. Это повлияет на скорость обновления / вставки и требования к хранилищу, но вы обнаружите, что в общем случае это не имеет значения, поскольку:

  • Подавляющее большинство баз данных читаются гораздо чаще, чем пишутся; и
  • большинство жалоб на базы данных связано со скоростью, а не с объемом памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...