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
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ónNVL
para convertir los valoresNULL
en un valor específico. Por ejemplo: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 enProductId
y también para consultas que filtren enProductId IS NULL
.Alternativamente, podría crear un índice filtrado en la columna
ProductId
, utilizando una cláusulaWHERE
para excluir los valoresNULL
:Esto creará un índice en todas las filas que tengan un valor de
ProductId
no nulo.