加入性能不够好 - Oracle SQL查询优化

时间:2015-08-21 02:21:38

标签: oracle performance query-optimization

我正在调查我们的应用程序花费太多时间从Oracle数据库获取数据的问题。在我的调查中,我发现查询的缓慢跟踪表之间的连接以及聚合函数SUM。 这可能看起来很简单,但我对SQL查询优化不太满意。

查询在

下面
SELECT T1.TONNES, SUM(R.TONNES) AS TOTAL_TONNES
    FROM
      RECLAIMED R ,
      (SELECT DELIVERY_OUT_ID, SUM(TONNES) AS TONNES FROM RECLAIMED WHERE DELIVERY_IN_ID=53773 GROUP BY DELIVERY_OUT_ID) T1
    where
       R.DELIVERY_OUT_ID = T1.DELIVERY_OUT_ID
    GROUP BY
       T1.TONNES

SUM(R.TONNES)是每次交付的总吨数。

SUM(TONNES)是每次交货的总吨数。

我的桌子看起来像 enter image description here

我在这个表中有1600万个条目,通过平均尝试多个delivery_in_id,查询重新开始大约需要6秒。

我有类似的数据库(完整副本,但只有400万个条目),当应用相同的查询时,我得到不到1秒。 它们具有相同的索引,因此我确信索引不是问题。

我确信它只是数据,它在第一个数据库(1600万)上很重。我有一种感觉,当优化此查询时,问题将得到解决。 公开征求建议:)

2 个答案:

答案 0 :(得分:0)

两个DB是否在同一台服务器上?如果不是,首先,比较计算机配置,设置和运行的应用程序。

如果没有差异,您可以尝试检查您想要SUM的列中是否包含NULL值。如果有的话,请使用NVL函数来改进查询。

此外,您可以"分析索引" (或"重建索引")。它清理了索引。 (它对你的数据非常快速和安全)。

如果没有帮助,请查看表格的TABLESPACE是否未满。它可能会产生一些影响......但我不确定。

- )

答案 1 :(得分:0)

我通过更新存储过程解决了性能问题。在加入第二个表之前,通过在第一个表中添加过滤器来优化它。以下是结果存储过程

 SELECT   R.DELIVERY_IN_ID, R.DELIVERY_OUT_ID, SUM(R.TONNES), 
 (SELECT SUM(TONNES) AS TONNES FROM RECLAIMED WHERE DELIVERY_OUT_ID=R.DELIVERY_OUT_ID) AS TOTAL_TONNES
    FROM
      CTSBT_RECLAIMED R  
      WHERE DELIVERY_IN_ID=53733 
      GROUP BY DELIVERY_IN_ID, R.DELIVERY_OUT_ID

由于我加入了一个巨大的桌子(16M),因此我的情况对时间/性能的影响很大。这个查询现在不到一秒钟。我怀疑的缓慢是由于1个表没有索引(参见T1),即使在我的情况下它只有大约20个项目,它足以减慢查询速度,因为它将它与1600万条目进行比较。 优化后的查询会对此1600万进行过滤,然后合并到T1。 应该有更好的方法来优化这个吗?大概。但我很满意这个结果并解决了我打算解决的问题。现在继续前进。 感谢那些评论的人。