Подсказка о вычислении предиката последним
Функция

Оптимизация выполнения поискового запроса путем управления очередностью выполнения предикатов.

Например, пусть:

  • в запросе к нескольким таблицам есть предикат "таблица1"."дата" between 'дата1' and 'дата2';

  • "таблица1" самая большая по количеству записей в запросе;

  • других однопеременных предикатов по "таблице1" в запросе нет;

  • но есть предикаты соединения "таблицы1" с другими таблицами по ключевым полям;

  • в диапазон между значениями 'дата1' и 'дата2' в "таблице1" попадает большая часть содержащихся в этой таблице записей.

Тогда рекомендуется использовать подсказку /* +LAST */ (обрабатывать предикат последним) для предиката "таблица1"."дата" between 'дата1' and 'дата2'.

В этом случае сначала будут обработаны другие предикаты запроса, которые, возможно, сильно уменьшат объем выборки соединяемых таблиц и только потом к этой уменьшенной выборке будет применен предикат с подсказкой /* +LAST */. В противном случае предикат типа "таблица1"."дата" between 'дата1' and 'дата2' может быть обработан одним из первых и по его условию в выборку может попасть почти вся очень большая таблица, и только потом к этой большой выборке начнется применение остальных предикатов.

Спецификация
 
< подсказка вычисления очередности предиката >::=
{-- +LAST | /* +LAST*/}
Синтаксические правила
  1. Подсказка применима к любому предикату (хотя для некоторых из них применять её нет смысла; в этом случае она бут проигнорирована).

  2. Подсказку /* +LAST */ имеет смысл указывать для однопеременного малоселективного предиката по очень большой таблице. Однопеременный малоселективный запрос отбирает почти все (или большинство) записей таблицы. Например, есть таблица с информацией о жителях города Воронеж. Предикат типа "город прописки" = 'Воронеж' – малоселективный, т.к. почти не уменьшает объем выборки, аналогично предикаты типа "пол" = 'мужской' или "пол" = 'женский' – тоже малоселективные. А, например, предикат типа "город прописки" = 'Липецк' – сильно селективный, объем выборки будет существенно меньше.

  3. Подсказка должна указываться после предиката, к которому должна быть применена, например:

    ... and  between < значение1 > and < значение2 > /* +last */ ...
Общие правила
  1. Подсказка применяется после обработки всех предикатов в группе предикатов без подсказки /* +LAST */, но соединенных по условию AND с предикатом с подсказкой +LAST.

  2. Проверка предикатов с подсказкой /* +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 будет обработан последним.

  3. При задании логических условий, отличных от 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|
    …
    

  4. В некоторых случаях использовать подсказку /* +LAST */ нет смысла, например, в таблице создан составной индекс по значениям некоторого столбца и соответствующей этому значению дате, причем в индексе дата указана второй, и отбор по значениям столбца является сильно селективным. Тогда лучше вместо подсказки +LAST использовать такой составной индекс.