es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Unión de indexación de Oracle en Not Null

Estamos haciendo ajustes de SQL/Indexación en una base de datos Oracle 11g. Actualmente no hay un índice en el ProductId de CustomerTransaction, por lo que queremos agregar uno para mejorar el rendimiento de Join tuning. Sin embargo, el DBA notó que el 95% de los ProductIds en CustomerTransaction son nulos. ¿Tiene Oracle una opción para indexar solo en filas que no sean nulas? ¿Cuál es la forma alternativa de indexar, o debemos aplicar el índice en este escenario de distribución/estadísticas del 90%?

select ct.customerId, pr.ProductName
from dbo.CustomerTransaction ct
inner join dbo.Product pr
on ct.ProductId = pr.ProductId

CREATE TABLE [dbo].[CustomerTransaction](
[CustomerTransactionId] [int] NOT NULL, // este es el identificador principal
[ProductId] [int] NULL,
[SalesDate] [datetime] NOT NULL,

)

ProductId, Distribución de recuento
lista de ejemplo, etc.

NULL, 34065306
2, 127444
3, 103996
5, 96280
6, 78247
366, 66744
9, 58251
4, 48056
10, 29841
155, 27353
8, 22143
1052, 20885
16, 18298
23204, 17242
21, 16413
26, 15084
11, 15061
23205, 14161
168, 14086
7, 14022
738, 13294
115, 12385
13, 12119
18, 11844
23208, 11610

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, Oracle tiene la opción de indexar solo en filas no nulas. Puede crear un índice basado en funciones en la columna ProductId, utilizando la función NVL para convertir los valores NULL en un valor específico. Por ejemplo:

    CREATE INDEX idx_CustomerTransaction_ProductId
    ON dbo.CustomerTransaction (NVL(ProductId, -1));
    

    Esto creará un índice en todas las filas, pero los valores NULL se indexarán como -1. Esto permitirá al optimizador utilizar el índice para consultas que filtren en ProductId y también para consultas que filtren en ProductId IS NULL.

    Alternativamente, podría crear un índice filtrado en la columna ProductId, utilizando una cláusula WHERE para excluir los valores NULL:

    CREATE INDEX idx_CustomerTransaction_ProductId
    ON dbo.CustomerTransaction (ProductId)
    WHERE ProductId IS NOT NULL;
    

    Esto creará un índice en todas las filas que tengan un valor de ProductId no nulo.

Comments are closed.