#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).
Комментариев нет:
Отправить комментарий