多个日期字段的索引

时间:2013-09-13 15:37:27

标签: sql-server

我有一个大量使用的脚本。脚本的主要部分,如果我删除,速度极快,是:

WHERE
(
        DateTimeField1 IS NULL OR
        DateTimeField2 IS NULL OR
        DateTimeField3 IS NULL
) AND
DateTimeField4 IS NULL

如果我在OR语句中排除了三个中的两个,它会加速。似乎因为我只检查是否为null,所以它应该非常有效。

1)索引这些字段或2)加速where子句的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我建议您更改表格以获得计算列,例如:

alter table t add
ValidDates as ((case when DateTimeField1 is null then 'N' else 'Y' end) +
               (case when DateTimeField2 is null then 'N' else 'Y' end) +
               (case when DateTimeField3 is null then 'N' else 'Y' end) +
               (case when DateTimeField4 is null then 'N' else 'Y' end)
              )

然后在计算列上创建索引:

create index t_validdates on t(validdates);

然后在您的查询中,将您的where条件替换为:

where ValidDates in ('YYYY', 'YYNY', 'YNYY', 'YNNY', 'NYYY', 'NYNY', 'NNYY')

这假设您要测试NULL的各种组合。如果它始终是您在查询中所拥有的,那么您可以将该条件设置为计算列。

答案 1 :(得分:0)

尝试包含列的索引:

CREATE INDEX idx_datetimes on YourTable (DateTimeField4)
INCLUDE (DateTimeField1 , DateTimeField2 , DateTimeField3 );

这可以找到DateTimeField4非常快的行。然后对于每个这样的行,可以快速完成其他三个的OR。根据OR的逻辑,甚至不需要在每一行中检查所有3个,具有NULL的第一个将使整个WHERE子句成立