如何在几个条件下调整简单的选择查询?

时间:2017-05-09 07:12:48

标签: oracle

我有如下查询。

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。我们有约束,就像任何新的索引都无法创建。请建议我们如何调整此查询。也使用了平行提示但没有太大改进。请建议。

1 个答案:

答案 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'));