我有一个包含InTime和OutTime列的表。
通常,当我将数据插入此表时,我将InTime设置为DateTime,将OutTime设置为null。删除数据后,将设置OutTime值。
当我在特定时间内获取数据时,我会使用以下内容:
where InTime < sometime and OutTime is > sometime or OutTime is null
我的问题是,在获得更好的查询/索引性能方面,我应该像Out maxtime那样将一些值放入OutTime并使该字段不可为空?
然后我的查询变为
where InTime < sometime and OutTime is > sometime
答案 0 :(得分:2)
将字段保留为NULL。不要使用OR,请使用UNION ALL:
select ... from ... where InTime < sometime and OutTime is > sometime
union all
select ... from ... where InTime < sometime and OutTime is null
使用魔术值而不是NULL是灾难的一个方法。至少,它使用更多的存储空间。更具体地说,它在强制数据库约束,计算聚合和应用程序时打破了NULL的语义。
在查询中使用OR会导致性能问题。 optmizer可能会将任何索引范围转换为扫描。使用UNION通常更好,因为优化器将创建两个计划,一个针对非NULL的一个最优的NULL,并且将它们联合起来。
如果您没有关于Intime和/或OutTime的任何索引,那么查询将是一个扫描,并且UNION的性能将比OR差,但那不是一个值得讨论的场景。当然,问题是如何在正确设计的存储上优化查询。