我有一个大量使用的脚本。脚本的主要部分,如果我删除,速度极快,是:
WHERE
(
DateTimeField1 IS NULL OR
DateTimeField2 IS NULL OR
DateTimeField3 IS NULL
) AND
DateTimeField4 IS NULL
如果我在OR语句中排除了三个中的两个,它会加速。似乎因为我只检查是否为null,所以它应该非常有效。
1)索引这些字段或2)加速where子句的最佳方法是什么?
答案 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子句成立