Oracle nepoužívá index, protože předpokládá select column_value from table(x)
vrátí 8168 řádků.
Indexy jsou rychlejší pro získávání malého množství dat. V určitém okamžiku je rychlejší skenovat celou tabulku, než opakovaně procházet strom indexu.
Odhadnout mohutnost běžného SQL příkazu je dost obtížné. Vytvoření přesného odhadu pro procedurální kód je téměř nemožné. Ale nevím, kde přišli na 8168. Tabulkové funkce se běžně používají s funkcemi zřetězenými v datových skladech, velké číslo dává smysl.
Dynamické vzorkování může vygenerovat přesnější odhad a pravděpodobně vytvořit plán, který bude index používat.
Zde je příklad špatného odhadu mohutnosti:
create or replace type type_table_of_number as table of number;
explain plan for
select * from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));
Plan hash value: 1748000095
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8168 | 00:00:01 |
| 1 | COLLECTION ITERATOR CONSTRUCTOR FETCH| | 8168 | 00:00:01 |
-------------------------------------------------------------------------
Zde je návod, jak to opravit:
explain plan for select /*+ dynamic_sampling(2) */ *
from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));
Plan hash value: 1748000095
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 7 | 00:00:01 |
| 1 | COLLECTION ITERATOR CONSTRUCTOR FETCH| | 7 | 00:00:01 |
-------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)