我有一个如下所示的查询。
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'));
该查询在生产环境中获取 20000 到 50000 之间的记录。 但仍然需要至少 50 分钟。 有时也需要 1 到 2 个小时。 我们在一列上有索引,即 更改日期 . 我们有约束,就像无法创建任何新索引一样。请建议我们如何调整此查询。也使用了并行提示,但没有太大改进。请指教。
更改查询,以便所有计算都对参数化值完成,以便查询可以在列上使用索引(而不是需要基于函数的索引(:
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'));