¿Los valores NULL son indexados?

No hace mucho recibí esta pregunta de unos de mis estudiantes, debo confesar que en un inicio titubee para dar la respuesta, pero finalmente dije que sí. Bueno pues en este post trataremos de demostrar si los valores nulos también son indexados.

Lo que me hizo dudar el hecho que los valores nulos sean indexados, fue el hecho de que los valores NULL no pueden ser buscados a traves de una condicion de igualdad, es decir, no puedes hacer lo siguiente, o mas bien si puedes pero nunca va a retornar registros:

SELECT *
FROM dbo.mitabla
WHERE col1 = NULL

Entonces para poder comprobar que los indices indexan los valores nulos vamos a crear una tabla sencilla como copia de los id y los nombres de todos los objetos de systema, seguidamente colocaremos como “nulable” la columa “name”, con el objetivo de insertar algunos valores nulos.

select object_id, name
into mytab
from sys.all_objects;

alter table mytab
  add constraint pk_mytab
    primary key (object_id);

alter table mytab
  alter column name sysname null;

Ahora vamos a insertar 3 valores nulos dentro de mi tabla y vamos a crear in indice por la columna “name”:

insert into mytab values (9999,null);
insert into mytab values (9998,null);
insert into mytab values (9997,null);

create index ix_mytab_name
  on mytab (name);

Ahora ha llegado la hora de la verdad, activamos la opción para que nos muestre el plan de ejecución actual, y ejecutamos la siguiente consulta:

select *
from mytab
where name IS NULL;

Ssms_2018-03-27_08-55-23

Vemos que efectivamente SQL Server utilizo un “Index Seek” para encontrar los valores nulos. Ahora vamos a verificar dentro de las estructuras internas de la tabla a ver si encontramos los valores de los indices. Para esto, primero vamos a utilizar el comando “DBCC IND” el cual me devuelve la lista de paginas utilizadas por una estructura de base de datos ya sea tabla o indice, en este caso es el indice número 2:

DBCC IND ('PruebaDB', 'mytab', 2);

2018-03-27_09-02-20

En este caso particular busco la pagina del nivel 1 y del tipo 2 ya que esto marca la pagina inicial de mi indice (Root Page). Luego verifico cuales son los valores que tiene, para esto usaremos otro comando DBCC:

DBCC TRACEON(3604)
DBCC PAGE ('PruebaDB', 1, 18776, 3);

2018-03-27_09-05-12

Aquí podemos observar que la pagina 18744 es la que tiene el valor NULL, entonces vayamos a esa pagina para ver que efectivamente los valores nulos son indexados:

DBCC PAGE ('PruebaDB', 1, 18744, 3);

2018-03-27_09-08-19

En conclusión, los valores nulos también son indexados y por ende los indices también pueden utilizarse para poder buscar registros que tengan columnas con valores nulos.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s