Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Использование INDEX FAST FULL SCAN

#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).

Комментариев нет:

Отправить комментарий