Sql server 多个日期字段上的索引

Sql server 多个日期字段上的索引,sql-server,Sql Server,我有一个被大量使用的脚本。脚本的主要部分(如果我删除它,速度会大大加快)是: WHERE ( DateTimeField1 IS NULL OR DateTimeField2 IS NULL OR DateTimeField3 IS NULL ) AND DateTimeField4 IS NULL 如果我在OR语句中排除三者中的两个,则速度会加快。似乎因为我只检查null,所以它应该非常有效 1)索引这些字段或2)加速where子句的最佳方法是

我有一个被大量使用的脚本。脚本的主要部分(如果我删除它,速度会大大加快)是:

WHERE
(
        DateTimeField1 IS NULL OR
        DateTimeField2 IS NULL OR
        DateTimeField3 IS NULL
) AND
DateTimeField4 IS NULL
如果我在OR语句中排除三者中的两个,则速度会加快。似乎因为我只检查null,所以它应该非常有效


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

尝试使用包含列的索引:

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

这将很快找到DateTimeField4为null的行。然后,对于每一行,其他三行的OR可以快速完成。甚至不是所有3个都需要按照的逻辑在每一行中进行检查,或者第一个带有NULL的行将使整个WHERE子句为真

我建议您将表更改为具有计算列,类似于:

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

这是假设您将要测试空值的各种组合。如果它始终是查询中的条件,则可以将该条件改为计算列。

为什么有4个
datetime
字段?该表包含指定特定操作发生时间的字段。这个表中有相当多的datetime字段。对我来说听起来不规范。尝试下面的答案。我使用datetime字段作为此表中某些操作/状态的标志。而不是仅仅使用位字段。我的状态字段太多,无法使用联合。我看不出这有什么帮助。我想我可以转换成比特。但这并不能解决我现在的问题,因为转换需要时间。解决方法是规范化您的表。谢谢。不幸的是,这似乎没有多大区别。你测试了所有四个,然后只测试了两个-简化版工作得更快?很棒的概念。但前三个日期字段返回的结果将少于第四个。在200000条记录中,“或”部分将返回大约800条,然后第四条将排除大约10条。我将进一步尝试。这很有道理。这正是我想要的。不是字母Y和N,也许是1和0?匹配过程中的计算速度应该更快。如您所述,创建了一个计算字段,称之为活动字段,而如果任何字段为空,则活动字段=1。然后创建索引。以前60毫秒内返回的计数,现在返回0。似乎没能加快我的查询速度。不过,这是一个很好的解决方案,我将采用这种方法。