index create sql performance indexing null db2

sql - create - Nulos de indexación para una búsqueda rápida en DB2



create index db2 (4)

Entiendo que los valores nulos no son indexables en DB2, suponiendo que tenemos una tabla enorme (Ventas) con una columna de fecha (sold_on) que normalmente es una fecha, pero que ocasionalmente (10% de las veces) es nula.

Además, supongamos que es una aplicación heredada que no podemos cambiar, por lo que los nulos se quedan allí y significan algo (digamos las ventas que se devolvieron).

Podemos hacer que la siguiente consulta sea rápida al poner un índice en las columnas sold_on y total

Select * from Sales where Sales.sold_on between date1 and date2 and Sales.total = 9.99

Pero un índice no hará que esta consulta sea más rápida:

Select * from Sales where Sales.sold_on is null and Sales.total = 9.99

Porque la indexación se realiza en el valor.

¿Puedo indexar nulos? Tal vez cambiando el tipo de índice? Indexando la columna del indicador?


La regla de oro es que un índice es útil para valores hasta el 15% de los registros. ... entonces un índice podría ser útil aquí.

Si DB2 no indexará nulos, le sugiero agregar un campo booleano, IsSold, y establecerlo en verdadero siempre que se establezca la fecha de sold_on (esto podría hacerse en un desencadenante).

Esa no es la mejor solución, pero podría ser lo que necesita.


No soy experto en DB2, pero si el 10% de sus valores son nulos, no creo que un índice en esa columna solo pueda ayudarlo. 10% es demasiado para molestarse con el uso de un índice, solo hará un escaneo de tabla. Si estuvieras hablando del 2-3%, creo que realmente usaría tu índice.

Piense en cuántos registros hay en una página / bloque, digamos 20. La razón para usar un índice es evitar obtener páginas que no necesita. Las probabilidades de que una página determinada contenga 0 registros que son nulos son (90%) ^ 20 o 12%. Esas no son buenas probabilidades: necesitará el 88% de sus páginas para ser recuperadas de todos modos, usar el índice no es muy útil.

Sin embargo, si su cláusula de selección solo incluía algunas columnas (y no *), digamos solo salesid, probablemente podría usar un índice en (sold_on, salesid), ya que la lectura de la página de datos no sería Necesario: todos los datos estarían en el índice.


¿De dónde sacó la impresión de que DB2 no indexa NULLs? No encuentro nada en la documentación ni en los artículos que respaldan el reclamo. Y acabo de realizar una consulta en una tabla grande utilizando una restricción IS NULL que implica una columna indexada que contiene una pequeña fracción de NULLs; en este caso, DB2 ciertamente usó el índice (verificado por un EXPLAIN, y al observar que la base de datos respondía instantáneamente en lugar de perder tiempo para realizar un escaneo de tabla).

Entonces: afirmo que DB2 no tiene ningún problema con NULLs en índices de clave no primaria.

Pero como otros han escrito: sus datos pueden estar compuestos de manera que DB2 piense que usar un índice no será más rápido. O las estadísticas de la base de datos no están actualizadas para la (s) tabla (s) involucrada (s).


Troels es correcto; incluso las filas con un valor SOLD_ON de NULL se beneficiarán de un índice en esa columna. Si realiza búsquedas a distancia en SOLD_ON, puede beneficiarse aún más creando un índice agrupado que comience con SOLD_ON. En este ejemplo particular, es posible que no se requiera mucha sobrecarga adicional para mantener el orden de agrupamiento basado en SOLD_ON, ya que las filas más nuevas agregadas probablemente tengan una fecha SOLD_ON más reciente.