Pregunta

Tengo una tabla con una columna InTime y OutTime.

Normalmente, cuando inserto datos en esta tabla, configuro InTime en DateTime y OutTime en nulo. Cuando se eliminan los datos, se establece un valor de OutTime.

Cuando obtengo datos para un momento en particular, uso algo como:

where InTime < sometime and OutTime is > sometime or OutTime is null

Mi pregunta es, en términos de obtener un mejor rendimiento de consulta / índice, ¿debería poner algún valor en OutTime como el datetime máximo y hacer que el campo no sea anulable?

Entonces mi consulta se convierte en

where InTime < sometime and OutTime is > sometime
¿Fue útil?

Solución

Deje el campo NULL. No use OR, use UNION ALL:

select ... from ... where InTime < sometime and OutTime is > sometime 
union all
select ... from ... where InTime < sometime and OutTime is null

Usar valores mágicos en lugar de NULL es una receta para el desastre. Por lo menos, usa más almacenamiento. Más específicamente, rompe la semántica de NULL al aplicar restricciones de la base de datos, al calcular agregados y en aplicaciones.

Usar OR en consultas es pedir problemas de rendimiento. Es probable que el optimizador convierta cualquier búsqueda de rango de índice en escaneos. El uso de UNION suele ser mejor, ya que el optimizador creará dos planes, uno óptimo para los NULL y otro para los que no son NULL, y los unirá.

Si no tiene ningún índice en Intime y / o OutTime, la consulta será un escaneo de todos modos y la UNION funcionará peor que un OR, pero ese no es un escenario del que valga la pena hablar. La pregunta es, por supuesto, cómo optimizar una consulta en correctamente almacenamiento diseñado.

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