Si obtiene todas las filas de la tabla, ¿por qué cree que debería usar el índice? Una exploración de tabla completa es el medio más eficiente para devolver todos los valores. No tiene nada que ver con que los nulos no estén en el índice y que todo tenga que ver con que el optimizador elija los medios más eficientes para recuperar los datos.
@ A.B.Cade: Es posible que el optimizador pueda elegir usar el índice, pero no es probable. Supongamos que tiene una tabla con una tabla indexada con 100 filas, pero solo 10 valores. Si el optimizador usa el índice, tiene que obtener las 10 filas del índice, luego expandirlo a 100 filas, mientras que, con el escaneo de tabla completa, obtiene las 100 filas desde el principio. He aquí un ejemplo:
create table test1 (blarg varchar2(10));
create index ak_test1 on test1 (blarg);
insert into test1
select floor(level/10) from dual connect by level<=100;
exec dbms_stats.gather_table_stats('testschema','test1');
exec dbms_stats.gather_index_stats('testschema','ak_test1');
EXPLAIN PLAN FOR
select * from test1;
Mi punto es en gran parte de que esta cuestión se basa en gran medida en una premisa errónea: que el índice-scans son intrínsecamente mejores que las exploraciones de tabla completa. Eso no siempre es cierto, como lo demuestra este escenario.
Como un lado, la lata de tabla completa se realizó en su primer ejemplo ya que estaba seleccionando un gran porcentaje de los registros de la tabla (en su caso, 100%). No importa si tenía un índice de valor nulo, el optimizador habría optado por un FTS para esta consulta. – Ollie
@Ollie. Esta es la razón por la que escribí que lo intenté de nuevo con un 'hint' y no ayudó ... – gdoron
, los índices típicos de b-tree no incluirán nulos. Los índices de mapa de bits indexarán nulos. – tbone