На самом деле может произойти снижение производительности при удалении индекса для одного столбца.
Предположим, вы выполняете запрос с WHERE [Column1] = 123
.Это можно решить с помощью оригинального индекса.Новый индекс также может быть использован для этого, но в зависимости от реализации потребуется также прочитать значения для [Column2] в индексе, даже если они не используются.
Так что да, вТеория может быть обратной стороной для понижения индекса: увеличение чтения.
[Обновление 9 сентября.]
Недавно я столкнулся с другой ситуацией, когда отдельный индекс может быть намного лучше , чем комбинированный индекс..
Рассмотрим огромную таблицу «ошибок» со столбцами [status], [creatate] и некоторыми другими полями.Большинство ошибок будут закрыты, поэтому предположим, что статус равен «0» (открыт) для 100 записей и «1» (закрыт) для 99000 записей.
SELECT * FROM bugs WHERE status = '0'
значительно выиграет от индекса на status
, тогда как приSELECT * FROM bugs WHERE status = '1'
индекс для status
не поможет.
Oracle будет знать разницу, поскольку он строит статистику по индексу.
Однако с объединенным индексом по status, createdate
каждый индексзапись почти уникальна, и Oracle решит не использовать индекс для запроса SELECT * FROM bugs WHERE status = '0'
, потому что он догадывается (ошибочно), что индекс не поможет.
Таким образом, в этой ситуации не следует отбрасывать только один индекспотому что это префикс к комбинированному индексу.
Примечание: Теоретически Oracle может построить еще более умную статистику по индексу, но, похоже, этого не происходит.