Несмотря на то, что на этот вопрос уже дан ответ и один ответ уже принят, я просто добавлю еще немного информации: -)
Индекс - это предложение для СУБД, которое оно может использовать для доступа к данным. быстрее в некоторых ситуациях. Использует ли он на самом деле индекс, - это решение, принятое СУБД.
Oracle имеет встроенный оптимизатор, который просматривает запрос и пытается найти наилучший план выполнения, чтобы получить результаты, к которым вы стремитесь.
Предположим, что 90% всех строк имеют B = 30 AND C = 99
. Зачем тогда Oracle кропотливо проходить по индексу только для того, чтобы наконец получить доступ почти ко всем строкам таблицы? Таким образом, даже с индексом в обоих столбцах Oracle может решить вообще не использовать индекс и даже выполнить запрос быстрее из-за решения по индексу.
Теперь к вопросам:
Если я создаю индекс только с использованием столбца B, это уже улучшит мой запрос, верно?
Может. Если Oracle считает, что B = 30
уменьшает количество строк, которые ему придется прочесть из таблицы, то это будет.
Если это так, зачем мне создавать индекс с этими двумя столбцами?
Если комбинация B = 30 AND C = 99
ограничивает строки для дальнейшего чтения из таблицы, лучше использовать этот индекс вместо этого.
Если я решил создать индекс с B и C, если я запрашиваю выбор только B, будет ли индекс затронут этот индекс?
Если индекс находится на (B, C)
, т.е. сначала B, то Oracle может оказаться полезным, да. В крайнем случае, когда в таблице есть только два столбца, это будет даже покрывающий индекс (т. Е. Содержащий все столбцы, к которым обращаются в запросе), и СУБД не должна будет читать какую-либо строку таблицы, так как вся информация уже в самом индексе. Если индекс равен (C, B)
, т. Е. Сначала C, маловероятно, что индекс будет использоваться. В некоторых крайних случаях Oracle может сделать это, однако.