索引性能null与虚拟数据

时间:2009-10-27 22:33:41

标签: sql performance datetime indexing null

我有一个包含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

1 个答案:

答案 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差,但那不是一个值得讨论的场景。当然,问题是如何在正确设计的存储上优化查询。