Используются ли индексы, если предложение WHERE содержит неиндексированные столбцы
Я использую таблицу со следующими индексами:
ind1 : column A,B,C,D
ind2 : column G
ind3 : column C
ind4 : column F
ind5 : column D
ind6 : column E
В своем запросе я использую следующие критерии выбора:
SELECT * FROM table WHERE
A=a
AND B=b
AND C=c
AND D=d
AND E=e
AND F=f
AND H=h (H does not have an index)
Мой вопрос заключается в том, используются ли индексы таблицы, и если в этом запросе улучшена производительность, обратите внимание, что таблица содержит в общей сложности 12 столбцов и 32 млн записей.
1 ответ
Да, запрос почти наверняка будет использовать один из индексов, чтобы предварительно выбрать, какие строки могут заполнить хотя бы некоторые критерии. Чтобы проверить, верно ли условие WHERE для неиндексированных столбцов (например, для вашего столбца H), Oracle просто проверяет саму таблицу. Поскольку индекс указывает на правильное физическое расположение таблицы, это обычно довольно быстро.
Какой индекс используется, зависит от многих факторов, таких как размер таблицы, размер индекса, уникальность столбцов таблицы, уникальность индекса, распределение данных по значениям столбцов и т. Д.
Чтобы увидеть, какие индексы используются в вашем запросе, взгляните на план выполнения, который вы можете увидеть, например, в SQL Developer, нажав F10.
РЕДАКТИРОВАТЬ: По моему опыту, Oracle выбирает наиболее многообещающий индекс (который уменьшит количество строк больше всего), а затем проверяет все столбцы в WHERE
пункт по такой таблице смотри вверх.
Пожалуйста, убедитесь, что статистика таблицы обновлена. Если сомневаетесь, уточните у
SELECT table_name, last_analyzed FROM USER_TABLES;
Если last_analyzed пусто или старая дата, пожалуйста, найдите DBMS_STATS.GATHER_TABLE_STATS, чтобы обновить статистику.