significado significa que column cocina celulares sql database performance oracle indexing

sql - significa - Índice para columna nulable



que es null en cocina (3)

Tengo un índice en una columna que admite nulos y quiero seleccionar todos sus valores de esta manera:

SELECT e.ename FROM emp e;

En el plan de explicación, veo un FULL TABLE SCAN (incluso una sugerencia no ayudó)

SELECT e.ename FROM emp e WHERE e.ename = ''gdoron'';

Utiliza el índice ...

Busqué en Google y descubrí que no hay entradas nulas en los índices, por lo que la primera consulta no puede usar el índice.

Mi pregunta es simple: ¿por qué no hay entradas nulas en los índices?


No estoy seguro de que la primera consulta sea pertinente en términos de uso del índice, al menos la segunda podría hacerlo.

De todos modos, si bien es cierto que no puede indexar una columna que contiene un valor nulo, hay formas de hacerlo, como por ejemplo:

create index MY_INDEX on emp(ename, 1);

observe el , 1) al final que hace el truco.


Por defecto, las bases de datos relacionales ignoran los valores NULL (porque el modelo relacional dice que NULL significa "no presente"). Por lo tanto, Index no almacena el valor NULL, por lo tanto, si tiene una condición nula en la declaración de SQL, se ignora el índice relacionado (por defecto).

Pero puede solucionar este problema, consulte ESTE o ESTE artículo.


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.

@ABCade: 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. Aquí hay 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 medida que esta pregunta se basa en gran medida en una premisa defectuosa: los escaneos indexados son intrínsecamente mejores que los escaneos de tabla completa. Eso no siempre es cierto, como lo demuestra este escenario.