加快缓慢的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章