DB2 - 优化查询 - 将函数应用于当前日期或数据库列?
DB2 - optimized query - apply function to current date or db column?
我需要编写一个尽可能高效的查询,返回 mycol(timestamp 值)等于今天的行日期减去 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()
。您需要 运行 在您的环境中计时以确定这是否是您环境中的问题。
我需要编写一个尽可能高效的查询,返回 mycol(timestamp 值)等于今天的行日期减去 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()
。您需要 运行 在您的环境中计时以确定这是否是您环境中的问题。