sql >> Database >  >> RDS >> Oracle

Waarom negeert Oracle SQL Optimizer het indexpredikaat voor deze weergave?

Oracle gebruikt de index niet omdat het ervan uitgaat dat select column_value from table(x) geeft 8168 rijen terug.

Indexen zijn sneller voor het ophalen van kleine hoeveelheden gegevens. Op een gegeven moment is het sneller om de hele tabel te scannen dan herhaaldelijk door de indexstructuur te lopen.

Het inschatten van de kardinaliteit van een gewone SQL-instructie is al moeilijk genoeg. Het maken van een nauwkeurige schatting voor procedurele code is bijna onmogelijk. Maar ik weet niet waar ze 8168 bedacht hebben. Tabelfuncties worden normaal gesproken gebruikt met pijplijnfuncties in datawarehouses, een nogal groot aantal is logisch.

Dynamische bemonstering kan een nauwkeurigere schatting genereren en waarschijnlijk een plan genereren dat de index zal gebruiken.

Hier is een voorbeeld van een slechte schatting van de kardinaliteit:

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

Ga als volgt te werk om het op te lossen:

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)



  1. Foutcode 1005, SQL-status HY000:Kan geen tabel maken errno:150

  2. Optimaliseren SELECTEER ... WAAR IN (...)

  3. Hoe de datumtijd in Postgres in Unix-tijdperkwaarde te converteren?

  4. Index auto-increment voor Microsoft SQL Server 2008 R2