【问题标题】:Join Performance Not Good enough - Oracle SQL Query Optimisation连接性能不够好 - Oracle SQL 查询优化
【发布时间】:2015-08-25 11:41:09
【问题描述】:

我正在调查一个问题,即我们的应用程序需要花费太多时间从 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) 是每次交货的总吨数。

我的桌子看起来像

我在这个表中有 1600 万个条目,通过平均尝试多个 delivery_in_id,我得到大约 6 秒的时间让查询返回。

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

我确定这只是数据,它在第一个数据库(1600 万)上很重。我有一种感觉,当这个查询被优化时,问题就会得到解决。 欢迎提出建议:)

【问题讨论】:

  • RAM 缓存设置有多大?听起来 400 万个条目适合 RAM,而 1600 万个不适合。
  • 您好 BitBank,感谢您的评论,我怎么知道?
  • 我不是数据库专家,所以我不具体知道您需要做什么。我们的产品(使用 MySQL)有一个类似的问题,这是解决它的修复程序。
  • 你能告诉我们索引是什么吗?
  • 比较两个系统中的解释计划,看看是否有任何变化以及导致它变慢的对象。

标签: oracle performance query-optimization


【解决方案1】:

这两个数据库在同一台服务器上吗?如果不是,请先对比电脑配置、设置和运行的应用程序。

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

此外,您还可以“分析索引”(或“重建索引”)。它清理索引。 (这对您的数据来说非常快速且安全)。

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

;-)

【讨论】:

  • 要检查表和查询是否相同/是否具有相同的索引,在每个数据库上,使用解释计划作为@Naresh 对他的评论提出的建议。
  • 您好 Fabienne,感谢您的回答,请参阅我在原始问题中的评论。它们都在同一台服务器(我的本地机器)中。我没有检查空值,我现在会检查。尝试重建索引并没有效果。还检查了 EXPLAIN 计划,它们都相似,除了数据(一个数据库数据大于另一个)。
  • 更新:检查,没有空值。
【解决方案2】:

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

 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。 应该有更好的方法来优化它吗?大概。但我对这个结果很满意,并解决了我打算解决的问题。现在继续前进。 感谢那些评论的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2021-12-11
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多