Performance Oracle查询:它能更高效吗?

Performance Oracle查询:它能更高效吗?,performance,oracle,Performance,Oracle,我遇到的问题是,当选择的日期范围超过30年时,下面的查询会导致一些超时问题 下面的方法能更有效吗 select TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD, TB_INJECTIONANDPRODUCTION.WELLNAME, to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY'), sum(TB_INJECTIONANDPRODUCTION.MONTHLYOILPRODUCTION),

我遇到的问题是,当选择的日期范围超过30年时,下面的查询会导致一些超时问题

下面的方法能更有效吗

select TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD, 
TB_INJECTIONANDPRODUCTION.WELLNAME, 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY'), 
sum(TB_INJECTIONANDPRODUCTION.MONTHLYOILPRODUCTION), 
sum(TB_INJECTIONANDPRODUCTION.MONTHLYGASPRODUCTION), 
sum(TB_INJECTIONANDPRODUCTION.CONDENSATE), 
sum(TB_INJECTIONANDPRODUCTION.FREEGAS), 
sum(TB_INJECTIONANDPRODUCTION.MONTHLYWATERPRODUCTION), 
sum(TB_INJECTIONANDPRODUCTION.MONTHLYWATERINJECTION) 
from TB_INJECTIONANDPRODUCTION 
where 
TB_INJECTIONANDPRODUCTION.ENTITLEMENT like 'AZNEFT_28May%' and 
TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD = ? and 
TB_INJECTIONANDPRODUCTION.WELLNAME = ? and 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') >= ? and 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') <= ?
group by 
TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD, 
TB_INJECTIONANDPRODUCTION.WELLNAME, 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY')
order by 
TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD, 
TB_INJECTIONANDPRODUCTION.WELLNAME, 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY')
选择TB_injection and production.standard油田,
TB_注射和生产。WELLNAME,
to_char(TB_injection and production.MEASUREMENTDATE,'YYYY'),
总和(TB_注射量和生产量、每月生产量),
总和(TB_注射量和生产量,每月生产量),
总和(TB_注入和生产冷凝液),
总和(TB_注入和生产游离气体),
总和(TB_注射和生产。每月水生产),
总和(TB_注射和生产。每月水注射)
来自TB_注射和生产
哪里
TB_注射和生产权利,如“AZNEFT_28May%”和
TB_注入和生产。标准油田=?及
TB_INJECTIONANDPRODUCTION.WELLNAME=?及
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY')>=?及

对于_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY')我建议您在查询中可以做一些事情

首先,使用而不是TO_CHAR,因为提取日期更快

to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY')

避免这种类型的操作

to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') >= ?
它很可能执行隐式转换(这对性能非常不利)。我假设您正在向这个参数传递一个数字。所以在这里再次使用extract

请参阅其他参数类型和数据库字段类型,以避免隐式转换。例如,如果TB_INJECTIONANDPRODUCTION.STANDARDOILFIELD是一个数字,则将参数作为一个数字传递

之间使用
,以避免两次调用提取函数:

to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') >= ? and 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') <= ?

这只是一些建议。没有关于你的问题的更多信息,这就是我所能建议的。

你有正确的列索引吗?你需要在你的问题上添加更多信息,以获得适当的答案。比如表中的数据量和查询的解释计划。此外,您运行的oracle版本也会很好。是的,Arminin,有一些索引器作业作为夜间例行程序的一部分在这些字段上运行。我是否要求服务器以输入日期标准等方式处理太多信息?答案是:信息不足。但是为什么要在日期上使用to_字符(强制Oracle转换每个日期以便进行比较)?尝试传递度量值的实际日期。\u日期绑定值。执行计划是否在小范围和大范围内更改?
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') >= ? and 
to_char(TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE,'YYYY') <= ?
extract(year from TB_INJECTIONANDPRODUCTION.MEASUREMENTDATE) between ? and ?