uso una tipos tablas tabla sintaxis indice indexar index incluidas drop crear consultar con columnas clustered sql-server oracle filtered-index

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) );