DB2 - 优化查询 - 将函数应用于当前日期或数据库列?

DB2 - optimized query - apply function to current date or db column?

我需要编写一个尽可能高效的查询,返回 mycoltimestamp 值)等于今天的行日期减去 100 或 200 天。 (恰好 100 或 200 天前 - 不是一个范围)

注意 mycol 总是有 00.00.000000 时间。 (忽略这是为什么)

这是一个如何写的例子:

select * from mytable mt where 
date(mycol) in (current date - 100 days, current date - 200 days)

我认为这可能更有效:

select * from mytable mt where
mycol in (timestampadd(16,-100,timestamp(current date,'00:00:00')),
          timestampadd(16,-200,timestamp(current date,'00:00:00')))

我认为它更有效的原因是因为我没有在 mycol 上调用函数(就像我在第一个示例中所做的那样)并且 current date 上的计算每次只发生一次执行此查询,而不是针对每一行。

我的假设正确吗?

我认为第二种选择更有效,但出于其他原因。

如果您在列 mycol 上声明索引,则 IN 运算符会快得多。

但是此时你执行 date(mycol) db 不能再使用索引了。

最好的方法是测试两个查询 unsing analyze/ explain.

添加信息:

您应该考虑使用 EXISTS 而不是 IN 显示 HERE

使用 EXPLAIN de DB2 或 DB2 SQL 性能分析器测试您的两个查询 然后使用 EXISTS 版本尝试相同的方法。

我会把第二个版本写成:

select *
from mytable mt
where mycol in (timestamp(current date - 100 days, '00:00:00'),
                timestamp(current date - 200 days, '00:00:00')
               );

如果您关心性能,那么您应该在 mytable(mycol) 上建立索引,因为这会加快查询速度。如果没有索引,额外的开销是在每一行中调用 date()。您需要 运行 在您的环境中计时以确定这是否是您环境中的问题。