sql - 加速 Oracle 中大表的聚合

标签 sql oracle optimization aggregate-functions

我正在尝试了解如何提高 Oracle 数据库中聚合查询的性能。该系统用于运行金融系列模拟。

这是简化的设置:

  1. 第一个表table1有以下列

    日期 |编号 |值

    它是只读的,大约有 1 亿行,并在 id、date 上建立索引

  2. 第二个表 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/

相关文章:

mysql - 在 View 中格式化 mysql 十进制

java - 从 Oracle 迁移到 MySQL

java - jdbc中连接对象Con的范围

css - 从 CSS 识别颜色属性并组合选择器?

php - 如何将所有这些 MySQL 查询合并为一个?

sql - 帮助进行 SQL 查询

python - 优化整数系数列表与其长整数表示之间的转换

r - 在 R 中计算向量值 Hessian

php - 使用 mysql codeigniter 图像更新 null

database - 构建 PL/SQL IF THEN 语句的更好方法?