Pregunta

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

Además, supongamos que es una aplicación heredada que no podemos cambiar, por lo que esos valores nulos permanecen allí y significan algo (digamos ventas que fueron devueltas).

Podemos agilizar la siguiente consulta colocando 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 sobre el valor.

¿Puedo indexar valores nulos?¿Quizás cambiando el tipo de índice?¿Indexando la columna del indicador?

¿Fue útil?

Solución

No soy un experto en DB2, pero si el 10% de sus valores son nulos, no creo que un índice solo en esa columna ayude jamás a su consulta.El 10% es demasiado para molestarse en usar un índice; solo hará un escaneo de la tabla.Si estuviera hablando de un 2-3%, creo que en realidad usaría su índice.

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

Sin embargo, si su cláusula de selección solo incluye algunas columnas (y no *), digamos solo salesid, probablemente podría hacer que use 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.

Otros consejos

¿De dónde sacaste la impresión de que DB2 no indexa archivos NULL?No puedo encontrar nada en la documentación o artículos que respalden el reclamo.Y acabo de realizar una consulta en una tabla grande usando una restricción IS NULL que involucra una columna indexada que contiene una pequeña fracción de NULL;en este caso, DB2 ciertamente usó el índice (verificado mediante EXPLAIN y observando que la base de datos respondió instantáneamente en lugar de perder tiempo realizando un escaneo de la tabla).

Entonces:Afirmo que DB2 no tiene problemas con los NULL en índices de clave no primaria.

Pero como otros han escrito:Sus datos pueden estar compuestos de una manera en la 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 las tablas involucradas.

La regla general es que un índice es útil para valores de hasta el 15% de los registros....por lo que un índice podría resultar útil aquí.

Si DB2 no indexa valores nulos, sugeriría agregar un campo booleano, IsSold, y establecerlo en verdadero cada vez que se establezca la fecha sold_on (esto podría hacerse en un disparador).

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top