Что касается индексов, следует отметить, что они являются предварительно вычисленными значениями на основе порядка строк и данных в поле. В этом конкретном случае вы говорите, что field1 проиндексирован, и вы используете его в запросе следующим образом:
where field1_ like '%someGenericString%' and
field1_ <> 'someSpecificString'
В приведенном выше фрагменте запроса фильтр относится как к переменной части данных, так как символ процента (%) охватывает строку, а затем к другой конкретной строке. Это означает, что оптимизация Oracle по умолчанию, в которой не используется подсказка оптимизатора, сначала попытается найти строку внутри индексированного поля, а также определить, являются ли данные подстрокой данных в поле, а затем проверить, что данные не соответствуют другой конкретной строке. После проверки индекса проверяются остальные столбцы. Это очень медленный процесс, если он повторяется.
Подсказка NO_INDEX, предложенная администратором базы данных, устраняет предпочтение оптимизатора использовать индекс и, вероятно, позволит оптимизатору сначала выбрать более быстрые сравнения и не обязательно сначала принудительно сравнивать индексы, а затем сравнивать другие столбцы.
Это медленно, потому что сравнивает строку и ее подстроки:
field1_ like '%someGenericString%'
Хотя следующее быстрее, потому что оно специфично:
field1_ like 'someSpecificString'
Так что причина использовать подсказку NO_INDEX в том, что если у вас есть сравнения по индексу, которые замедляют процесс. Если поле индекса сравнивать с более конкретными данными, тогда сравнение индекса будет обычно быстрее.
Я говорю обычно , потому что, когда индексированное поле содержит больше избыточных данных, как в приведенном выше примере @Atish, ему придется пройти длинный список негативов сравнения, прежде чем будет возвращено положительное сравнение. Подсказки дают разные результаты, поскольку как дизайн базы данных, так и данные в таблицах влияют на скорость выполнения запроса. Таким образом, чтобы применить подсказки, вам нужно знать, будут ли отдельные сравнения, которые вы подсказываете оптимизатору, быстрее в вашем наборе данных. В этом процессе нет ярлыков. Применение подсказок должно происходить после написания правильных запросов SQL, поскольку подсказки должны основываться на реальных данных.
Проверьте эту ссылку подсказки: http://docs.oracle.com/cd/B19306_01/server.102/b14211/hintsref.htm