#sql #oracle #oracle12c #оптимизация_запросов
Почему в этом запросе используется INDEX RANGE SCAN, а не INDEX FAST FULL SCAN ведь все значения есть в самом к индексе и их можно выбрать оттуда, не обращаясь к таблице? -- Создание таблицы и построение функционального индекса create table del_nvl_ind as select id, case when val < 1 then null else round(val)*12 end val from ( select level id, level * dbms_random.value val from dual connect by level < 1000000 ); create index del_nvl_idx_nvl on del_nvl_ind (nvl(val,0)); -- Получение плана запроса explain plan for select val from del_nvl_ind where nvl(val,0) = 100; select * from table(dbms_xplan.display); | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 10000 | 107K| 600 (1)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| DEL_NVL_IND | 10000 | 107K| 600 (1)| 00:00:01 | |* 2 | INDEX RANGE SCAN | DEL_NVL_IDX_NVL | 4000 | | 3 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(NVL("VAL",0)=100) И еще вопрос - как можно изменить запрос, чтобы в плане появился INDEX FAST FULL SCAN?
Ответы
Ответ 1
Обращение к таблице и использование INDEX RANGE SCAN присутствовало ввиду следующих причин: Индекс построенный на nvl(val,0) не был покрывающим для поля val. Так как в индексе содержались уже преобразованные значения, а в самой таблице исходные (без преобразования функцией). После изменения в разделе SELECT запроса выражения VAL на NVL(VAL,0) индекс был использован уже без обращения к таблице с исходными данными. INDEX RANGE SCAN - это метод доступ а к диапазону данных индекса, а INDEX (FAST) FULL SCAN - метод доступа к полному набору данных. А так как в предикате запроса (WHERE) содержалось условие, ограничивающее набор данных, то полная выборка не имела смысла, поэтому и был использован именно этот метод доступа (RANGE SCAN).
Комментариев нет:
Отправить комментарий