Подсказка о вычислении предиката последним
Функция
Оптимизация выполнения поискового запроса путем управления очередностью выполнения предикатов.
Например, пусть:
-
в запросе к нескольким таблицам есть предикат "таблица1"."дата" between 'дата1' and 'дата2';
-
"таблица1" самая большая по количеству записей в запросе;
-
других однопеременных предикатов по "таблице1" в запросе нет;
-
но есть предикаты соединения "таблицы1" с другими таблицами по ключевым полям;
-
в диапазон между значениями 'дата1' и 'дата2' в "таблице1" попадает большая часть содержащихся в этой таблице записей.
Тогда рекомендуется использовать подсказку /* +LAST */ (обрабатывать предикат последним) для предиката "таблица1"."дата" between 'дата1' and 'дата2'.
В этом случае сначала будут обработаны другие предикаты запроса, которые, возможно, сильно уменьшат объем выборки соединяемых таблиц и только потом к этой уменьшенной выборке будет применен предикат с подсказкой /* +LAST */. В противном случае предикат типа "таблица1"."дата" between 'дата1' and 'дата2' может быть обработан одним из первых и по его условию в выборку может попасть почти вся очень большая таблица, и только потом к этой большой выборке начнется применение остальных предикатов.
Спецификация
::=
Синтаксические правила
-
Подсказка применима к любому предикату (хотя для некоторых из них применять её нет смысла; в этом случае она бут проигнорирована).
-
Подсказку /* +LAST */ имеет смысл указывать для однопеременного малоселективного предиката по очень большой таблице. Однопеременный малоселективный запрос отбирает почти все (или большинство) записей таблицы. Например, есть таблица с информацией о жителях города Воронеж. Предикат типа "город прописки" = 'Воронеж' – малоселективный, т.к. почти не уменьшает объем выборки, аналогично предикаты типа "пол" = 'мужской' или "пол" = 'женский' – тоже малоселективные. А, например, предикат типа "город прописки" = 'Липецк' – сильно селективный, объем выборки будет существенно меньше.
-
Подсказка должна указываться после предиката, к которому должна быть применена, например:
... and between
<значение1>
and<значение2>
/* +last */ ...
Общие правила
-
Подсказка применяется после обработки всех предикатов в группе предикатов без подсказки /* +LAST */, но соединенных по условию AND с предикатом с подсказкой +LAST.
-
Проверка предикатов с подсказкой /* +LAST */ выполняется путем просмотра выборки записей, полученной при обработке остальных предикатов группы, т.е. для этих предикатов очередность по отношению друг к другу не имеет большого значения.
select distinct make, count(*) from auto where auto.year between 60 and 80 /* + last */ and auto.color in ('BLACK', 'WHITE') and model='PANTERA' group by make; MAKE ---- |DE TOMASO | 6| Помеченный предикат between будет обработан последним.
-
При задании логических условий, отличных от and, подсказка будет действовать только внутри группы предикатов, соединенных по and.
select distinct make, count(*) from auto where auto.year between 60 and 80 /* + last */ and auto.color in ('BLACK', 'WHITE') or model='PANTERA' /* + last */ group by make; MAKE ---- |ALPINE | 2| |AMERICAN MOTORS | 32| |BMW | 2| …
-
В некоторых случаях использовать подсказку /* +LAST */ нет смысла, например, в таблице создан составной индекс по значениям некоторого столбца и соответствующей этому значению дате, причем в индексе дата указана второй, и отбор по значениям столбца является сильно селективным. Тогда лучше вместо подсказки +LAST использовать такой составной индекс.