加快缓慢的 oracle 查询

Posted

技术标签:

【中文标题】加快缓慢的 oracle 查询【英文标题】:Speed up slow oracle query 【发布时间】:2015-09-24 18:43:51 【问题描述】:

我有以下格式的 Oracle 查询:

select col1, min(col2), max(col2) 
from table1
where col2 between add_months(to_date('12/06/2014', 'mm/dd/yyyy'), -6) and to_date('12/05/2014', 'mm/dd/yyyy') 
and col3 = 'CLICKS' 
and col4 = '-8'  
and col1 in (select col1 from table2  where id = '05742') 
group by col1

在我的架构中,表 1 非常大(数百万,可能有数十亿条记录),但表 2 相当小。关于如何优化它的任何想法?

【问题讨论】:

目前的查询计划是什么?有哪些索引可用?各种条件的选择性如何?需要读取table1 中的多少行才能生成聚合?查询需要多长时间?您需要它多快运行?物化视图是一种选择吗? 您为什么在日期文字上使用 ADD+MONTHS 而不是更改日期的字符串?不是性能问题,只是卡住。另外,col4 真的是一个字符串吗?如果不是,为什么'-8' 贾斯汀所说的,以及。在指定的日期范围内有多少行(百分比)?其中有多少在table2 中有col1 匹配行?大概你没有使用分区(尽管可能有数十亿行)? 【参考方案1】:

试试这个:

select t2.col1, min(col2), max(col2)
from table2 t2
join table1 t1 on t1.col1 = t2.col1
  on t1.col2 between add_months(to_date('12/06/2014', 'mm/dd/yyyy'), -6) and to_date('12/05/2014', 'mm/dd/yyyy')
  and t1.col3 = 'CLICKS'
  and t1.col4 = '-8'
where t1.id = '05742' 
group by t2.col1

当 table2 较小而 table1 较大时,这将特别有效。

注意:如果table.id 的数据类型是numeric(而不是文本),则应将 where 子句条件编码为:

where t1.id = 5742

所以值类型匹配列类型,以防 db 愚蠢并强制转换列以匹配值,而不是相反,因此不使用此索引,我见过很多次发生这种情况。

【讨论】:

以上是关于加快缓慢的 oracle 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL 百分位数计算运行非常缓慢 - 需要帮助加快速度

Oracle 11g,如何加快“in”查询

Oracle:连接两个快速、不相关的查询导致查询缓慢

Oracle SQL 查询运行缓慢

postgresql,查询运行缓慢

使用 ADF 和 Oracle SQL 执行缓慢的视图