Управление оптимизацией выполнения запросов
В СУБД ЛИНТЕР оптимизация выполнения запросов осуществляется на двух уровнях:
-
внутренний уровень – оптимизация выполнения запросов ядром СУБД на основе синтаксиса SQL-запроса. При использовании этого метода учитывается иерархическое старшинство операций. Если для какой-либо операции существует более одного пути ее выполнения, то выбирается тот путь, чей ранг выше, т.к. в большинстве случаев он выполняется быстрее, чем путь с более низким рангом;
-
внешний уровень – с помощью подсказок программиста. Оптимизатор не может использовать индексный путь доступа, основываясь только на существовании индекса; путь доступа должен стать известным при обработке SQL-запроса. Для этого используется механизм «подсказок» (hints).
Подсказки могут располагаться как внутри текста запроса (между ключевыми словами и элементами выражений), так и в конце. Текст запроса не может начинаться с подсказки.
Допустимое местоположение подсказок:
select count (*) from auto /*+ NOCACHE */; select /*+ NOCACHE */ count (*) from auto; select count (*) from /*+ NOCACHE */ auto; select count (* /*+ NOCACHE */ ) from auto; select sysdate- /*+ NOCACHE */ 7;
Недопустимое местоположение подсказок:
/*+ NOCACHE */ Select count (*) from auto; select cou /*+ NOCACHE */ nt (*) from auto;
Комментарий к подсказкам может быть как строковым ('--'), так и блочным ('/*, */'). Строковый комментарий исключает из выполнения только одну строку, перед которой стоит признак комментария, блочный комментарий исключает из выполнения целый блок команд, заключенный в указанную конструкцию.
select * from t1, t2, t3, t4 where t1.id=t2.id -- +PREDORDER = 3 and t3.value=t4.value /*+PREDORDER=2*/ and t2.id=t3.id /*+PREDORDER=4*/ and t3.id=t4.id /*+PREDORDER=1*/;