我有如下查询。
select col1,col2,col3,col4
from table
where CHANGETIME BETWEEN 0 AND 86399
AND changedate+(changetime/86400) > To_Date('parameterised value','MM/DD/YYYY HH24:MI:SS')
AND CHANGEDATE >= trunc(To_Date('parameterised value','MM/DD/YYYY HH24:MI:SS'));
查询在prod环境中获取20000到50000之间的记录。但仍然需要至少50分钟。有时也需要1到2个小时。我们在一列上有索引,即CHANGEDATE。我们有约束,就像任何新的索引都无法创建。请建议我们如何调整此查询。也使用了平行提示但没有太大改进。请建议。
答案 0 :(得分:3)
更改查询,以便对参数化值进行全部计算,以便查询可以使用列上的索引(而不是需要基于函数的索引):
select col1,col2,col3,col4
from table
where CHANGETIME BETWEEN 0 AND 86399
AND CHANGETIME > ( TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS')
- TRUNC(TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS'))
) * 86400
AND CHANGEDATE >= TRUNC(TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS'));
甚至:
select col1,col2,col3,col4
from table
where CHANGETIME
BETWEEN ( TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS')
- TRUNC(TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS'))
) * 86400 + 1
AND 86399
AND CHANGEDATE >= TRUNC(TO_DATE(:value,'MM/DD/YYYY HH24:MI:SS'));