我正在尝试了解如何提高Oracle数据库中聚合查询的性能。该系统用于运行金融系列模拟。
以下是简化设置:
第一个表table1有以下列
日期| id |值
它是只读的,有大约1亿行并且在id,date上编入索引
第二个表table2是由应用程序根据用户输入生成的,相对较小(300K行)并具有以下布局:
id | start_date | end_date |因素
生成第二个表后,我需要按如下方式计算总计:
select date, sum(value * nvl(factor,1)) as total
from table1
left join table2 on table1.id = table2.id
and table1.date between table2.start_date and table2.end_date group by date
我的问题是这很慢,如果第二张桌子特别大,则需要20-30分钟。有没有一种通用的方法可以加快速度,可能会牺牲存储空间和执行时间,理想情况下,可以在一分钟内实现运行?
我不是数据库专家,并且一直在阅读Oracle性能调优文档,但无法找到适合自己的内容。我找到的最有希望的想法是OLAP多维数据集,但据我所知,只有在我的第二个表被修复并且我只需要对数据应用不同的过滤器时,这将有所帮助。
答案 0 :(得分:2)
首先,为了提供任何真正的见解,您需要确定Oracle为慢速查询生成的执行计划。
你说第二个表是〜300K行 - 是的,与100M相比较小但由于你在两个表之间的连接中有一个范围条件,很难说在任何一个表中有多少行可能被访问给定执行查询。如果访问了大部分表,但查询优化器无法识别,则索引实际上可能会受到伤害而不是帮助。
您可能会将table1重新组织为索引组织表,因为您已经有一个涵盖大多数列的索引。但到目前为止,我可以从信息中得出的结论是,它可能有所帮助,但可能没有。
答案 1 :(得分:0)
除indexes
外,请尝试以下操作。我的两分钱!
尝试使用多个处理器的PARALLEL选项运行此查询。 /*+ PARALLEL(table1,4) */
。
NVL
已经完成了数百万行,这将产生影响
在某种程度上,数据的组织方式是什么?
如果您知道提前的日期,可能会将此查询分开
通过使用ids
和TABLE2
在start
date
中获取end date
来分成两个块。并使用a向JOIN
发出TABLE1
view
或temp table
。我们使用index
(id
作为。{
最佳前沿
谢谢!