Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum ignoriert Oracle SQL Optimizer das Indexprädikat für diese Ansicht?

Oracle verwendet den Index nicht, da es davon ausgeht, dass select column_value from table(x) gibt 8168 Zeilen zurück.

Indizes sind schneller zum Abrufen kleiner Datenmengen. Irgendwann ist es schneller, die ganze Tabelle zu scannen, als den Indexbaum wiederholt zu durchlaufen.

Es ist schwierig genug, die Kardinalität einer regulären SQL-Anweisung abzuschätzen. Das Erstellen einer genauen Schätzung für prozeduralen Code ist fast unmöglich. Aber ich weiß nicht, wo sie auf 8168 gekommen sind. Tabellenfunktionen werden normalerweise mit Pipeline-Funktionen in Data Warehouses verwendet, eine ziemlich große Anzahl ist sinnvoll.

Dynamisches Sampling kann eine genauere Schätzung erstellen und wahrscheinlich einen Plan erstellen, der den Index verwendet.

Hier ist ein Beispiel für eine schlechte Kardinalitätsschätzung:

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 |
-------------------------------------------------------------------------

So beheben Sie das Problem:

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)