Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que o Oracle SQL Optimizer está ignorando o predicado de índice para essa exibição?


O Oracle não usa o índice porque assume select column_value from table(x) retorna 8168 linhas.

Os índices são mais rápidos para recuperar pequenas quantidades de dados. Em algum ponto, é mais rápido varrer toda a tabela do que percorrer repetidamente a árvore de índice.

Estimar a cardinalidade de uma instrução SQL regular é bastante difícil. Criar uma estimativa precisa para o código de procedimento é quase impossível. Mas eu não sei de onde eles vieram com 8168. As funções de tabela são normalmente usadas com funções em pipeline em data warehouses, um número meio grande faz sentido.

amostragem dinâmica pode gerar uma estimativa mais precisa e provavelmente gerar um plano que usará o índice.

Aqui está um exemplo de uma estimativa de cardinalidade ruim:
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 |
-------------------------------------------------------------------------

Veja como corrigi-lo:
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)