Стратегия доступа к данным при вычислении однопеременных предикатов

Рассмотрим однопеременный предикат вида

< столбец > < OP > < значение >

где < OP > – некоторая логическая операция.

Для обработки подобных предикатов будет применен индекс, если выполняется одно из условий:

  1. < OP > входит в множество операций: =, <  >,  >=, < =,  >, < , IS NULL, IN, а < значение > – константа, внешняя ссылка, список констант (для IN) или подзапрос;

  2. < OP > – это оператор LIKE, а < значение > – текстовая константа, которая не начинается с '_' или '%';

  3. < столбец > – индексированный столбец или столбец производного множества, получаемый из индексированного столбца без каких-либо преобразований;

  4. < столбец > – это ROWID и при вычислении предиката не требуется преобразования типов;

  5. < столбец > – это столбец, для которого задан предикат на равенство и у которого существует одностолбцовый составной индекс, а при вычислении не требуется преобразования типов;

  6. < столбец > – столбец, входящий в многостолбцовый составной индекс, первый элемент которого тоже входит в условие, вычисляемое по индексу. При наличии нескольких составных индексов делается попытка выбрать наилучшее множество этих индексов для обработки группы предикатов.

Если предикат не может быть вычислен по индексу, однако зависит только от одного индексированного столбца, то он вычисляется с помощью прохода по индексу.

Например,

LOWER(PASSWORD) = 'manager'

где PASSWORD – индексированный столбец.

При вычислении предикатов с использованием индексов выполняется проверка (после завершения обработки каждого следующего предиката) количества оставшихся в выборке данных записей.

Если число записей стало меньше некоторой границы (200 записей), то все оставшиеся предикаты вычисляются перебором (полным просмотром таблицы), в противном случае оптимизатор вычисляет приблизительно, сколько страниц нужно считать для обработки каждого предиката по индексу и сколько – при обработке его перебором, и принимает решение, переводить ли этот предикат на обработку перебором.

Предикат типа «< столбец > IN < подзапрос >» может реально вычисляться как двухпеременный предикат.