sql-server - una - tipos de indices en sql
¿Tiene Oracle un concepto de índice filtrado? (3)
Aquí hay una pequeña variante de la respuesta de Justin y Alex que podría ahorrar más espacio en el índice y hace que la consulta modificada sea más fácil de leer IMO:
CREATE INDEX TimeSeriesPeriodSs1
ON TimeSeriesPeriod(
(CASE WHEN completionStatus = ''Complete'' AND validationStatus = ''Pending''
THEN 1
ELSE NULL
END);
SELECT * FROM TimeSeriesPeriod
WHERE 1 = (CASE WHEN completionStatus = ''Complete'' AND validationStatus = ''Pending''
THEN 1
ELSE NULL
END)
Similar a SQLServer donde puedo hacer lo siguiente
create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (validationStatus, completionStatus)
where completionStatus= N''Complete''
and validationStatus= N''Pending''
Es posible que pueda usar un índice basado en funciones para esto, aunque no es muy agradable para este escenario:
create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (
case when validationStatus= N''Pending'' and completionStatus= N''Complete'' then validationStatus else null end,
case when validationStatus= N''Pending'' and completionStatus= N''Complete'' then completionStatus else null end);
Tendría que hacer que la cláusula where
la consulta coincida exactamente para hacer que use el índice.
select <fields>
from TimeSeriesPeriod
where case when validationStatus= N''Pending'' and completionStatus= N''Complete'' then validationStatus else null end = N''Pending''
and case when validationStatus= N''Pending'' and completionStatus= N''Complete'' then completionStatus else null end = N''Complete'';
Esto sería mucho más ordenado si puede definir funciones (deterministas) para hacer el case
. Vea aquí para más información y ejemplos. O esto , de un rápido Google.
Puede crear un índice basado en funciones en Oracle que aproveche el hecho de que los valores NULL no se almacenan en índices b-tree. Algo como
CREATE INDEX TimeSeriesPeriodSs1
ON TimeSeriesPeriod(
(CASE WHEN completionStatus = ''Complete'' AND validationStatus = ''Pending''
THEN validationStatus
ELSE NULL
END),
(CASE WHEN completionStatus = ''Complete'' AND validationStatus = ''Pending''
THEN completionStatus
ELSE NULL
END)
);