我正在尝试了解如何提高 Oracle 数据库中聚合查询的性能。该系统用于运行金融系列模拟。
这是简化的设置:
第一个表table1有以下列
日期 |编号 |值
它是只读的,大约有 1 亿行,并在 id、date 上建立索引
第二个表 table2 由应用程序根据用户输入生成,相对较小(300K 行)并且具有以下布局:
编号 |开始日期 |结束日期 |因素
生成第二个表后,我需要按如下方式计算总计:
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 多维数据集,但我知道这只有在我的第二个表是固定的并且我只需要对数据应用不同的过滤器时才有用。
最佳答案
首先,要提供任何真正的见解,您需要确定 Oracle 为慢速查询生成的执行计划。
您说第二个表大约有 300K 行 - 是的,与 100M 相比很小,但是由于您在两个表之间的连接中有一个范围条件,所以很难说在任何情况下可能会访问 table1 中的多少行给定查询的执行。如果表的很大一部分被访问,但查询优化器没有意识到这一点,索引实际上可能会造成伤害而不是帮助。
您可能会受益于将 table1 重新组织为索引组织表,因为您已经拥有覆盖大部分列的索引。但根据目前的信息,我只能说它可能有帮助,但也可能没有帮助。
关于sql - 加速 Oracle 中大表的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713114/