Вам необходимо понять, как Oracle обращается к записям в базе данных.Считывание индекса - это одно действие, чтение таблицы - это другое действие.Таким образом, для извлечения одной индексированной записи из таблицы требуется как минимум две операции чтения.
Ваш запрос использует три элемента информации:
- столбец DELETED (критерий ограничения)
- столбец CREATED (критерий сортировки)
- идентификатор (набор результатов)
Oracle не индексирует значения NULL, поэтому индекс одного столбца для DELETED
не будетпомочь тебе.Это полное сканирование таблицы, и не лучше, чем отсутствие индекса вообще.
Индекс для CREATED
сам по себе лучше, потому что путь доступа станет следующим:
INDEX FULL SCAN DESCENDING
То есть, он начинается с самых последних дат в индексе и работает в обратном направлении.Однако для запроса все равно потребуется прочитать таблицу, чтобы найти идентификатор и значения DELETED.Это может быть много чтения таблицы, в зависимости от того, как часто DELETED имеет значение null.
Теперь составной индекс для (CREATED, DELETED)
в этом порядке должен быть более полезным, потому что Oracle теперь будетиндексировать NULL в столбце DELETED
.Oracle может использовать индекс, чтобы гарантировать, что он только ищет записи таблицы, чтобы получить значения ID
.Это будет пятнадцать операций чтения таблицы.
Наконец, вы можете построить составной индекс на (CREATED, DELETED, ID)
и обслуживать весь запрос из индекса.Это самый быстрый вариант.
Тогда вам просто нужно решить, оправдывают ли выигрыши в производительности издержки на поддержание индекса.Что бы это ни стоило, стоимость обслуживания составного индекса добавляет небольшую долю к стоимости обслуживания индекса из одного столбца.
Между прочим, ужасные запросы, подобные этому, являются одной из причин, почему плохая идея использовать логическое удаление.Физически удалите свои записи и используйте журнальные таблицы для извлечения исторического состояния вашей таблицы, когда вам это нужно.