Из документации (выделение добавлено):
Составные индексы могут ускорить получение данных для операторов SELECT
, в которых предложение WHERE
ссылается на все или ведущая часть столбцов в составном индексе. Следовательно, порядок столбцов, используемых в определении, важен. В общем, наиболее часто используемые столбцы go first.
Если вы фильтруете только по лидирующим столбцам - id
в вашем случае - тогда индекс по-прежнему используется для идентификации этих строк, и другие столбцы игнорируются. Если вы фильтруете по всем столбцам в индексе, то будет идентифицировано меньшее количество записей индекса; поэтому, когда вы знаете оба значения столбца, которые ищете, это все равно будет более эффективным.
Если вы будете когда-либо только фильтровать в id
и всегда будете получать все даты, тогда не будет много Можно сделать его составным индексом, но если вы иногда / обычно будете фильтровать по обоим столбцам, тогда составной лучше, чем индексировать только по id
(или иметь отдельные индексы для id
и create_date
).
Если вы фильтруете только по create_date
Oracle, иногда можете выбрать «пропустить сканирование», если оно считает это целесообразным:
В некоторых случаях, например, когда передний столбец имеет очень с низкой кардинальностью, база данных может использовать сканирование с пропуском этого индекса (см. « сканирование с пропуском индекса »).
Даже если она не может этого сделать, она может выполнить полное сканирование индекса, если оно считает, что это более эффективно, чем полное сканирование таблицы - опять-таки, отчасти это зависит от количества элементов, а также от того, ссылаетесь ли вы на неиндексированные столбцы.
В вашем примере это кажется вероятным который id
уникален, и поэтому каждый id
может иметь только один create_date
, что может повлиять на ваш дизайн индекса - но в настоящий момент вы все еще можете использовать сканирование с пропуском по этому индексу, чтобы найти строки, созданные в определенную дату range.
Если у вашей реальной таблицы действительно есть другие столбцы, тогда, если вы хотите только получить значения идентификатора и даты, наличие даты в индексе также означает, что может вообще не понадобиться просматривать таблицу - это можно получить все, что ему нужно, из индекса, с меньшим количеством попаданий в кэш / диск. (Опять же, все это зависит от того, что оптимизатор решит, что это наиболее эффективный путь доступа для указанных c запросов, данных и статистики ...)