0

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

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

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

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

4

2 回答 2

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 的各种组合。如果它始终是您在查询中所拥有的,那么您可以将该条件改为计算列。

于 2013-09-13T16:19:33.167 回答
0

尝试包含列的索引:

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

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

于 2013-09-13T15:53:27.963 回答