加入性能不够好 - Oracle SQL 查询优化
Join Performance Not Good enough - Oracle SQL Query Optimisation
我正在调查一个问题,即我们的应用程序从 Oracle 数据库获取数据需要花费太多时间。在我的调查中,我发现查询的缓慢归因于 tables 之间的连接以及聚合函数 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) 是每次交货的总吨数。
我的table长得像
我在这个 table 中有 1600 万个条目,通过平均尝试多个 delivery_in_id,我得到大约 6 秒的查询时间。
我有类似的数据库(完整副本但只有 400 万个条目),当应用相同的查询时,我得到的时间不到 1 秒。
他们有相同的索引,所以我相信索引不是问题。
我确定它只是数据,它在第一个数据库(1600万)上很重。我有一种感觉,当这个查询被优化时,问题就会得到解决。
欢迎提出建议:)
这两个数据库是在同一个服务器上吗?如果不是,首先比较计算机配置、设置和 运行 应用程序。
如果没有差异,您可以尝试检查您要求和的列中是否有NULL 值。如果有的话,使用 NVL 函数来改进您的查询。
此外,您可以 "Analyse index"(或 "Rebuild Index")。它清理索引。 (这对您的数据来说非常快速和安全)。
如果没有帮助,请查看您的 table 的 TABLESPACE 是否未满。可能会有一些影响...但我不确定。
;-)
我已经通过更新存储过程解决了性能问题。通过在加入第二个 table 之前在第一个 table 中添加一个过滤器来优化它。下面是结果存储过程
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
timing/performance 中的结果对我来说很大,因为我加入了一个巨大的 table(16M)。这个查询现在进行不到一秒钟。缓慢,我怀疑是由于 1 table 没有索引(见 T1),即使在我的例子中它只有大约 20 个项目,它足以减慢查询速度,因为它将它与 1600 万个进行比较条目。
优化查询对这 1600 万进行过滤,然后合并到 T1。
是否应该有更好的方法来优化它?大概。但我对这个结果很满意,解决了我打算解决的问题。现在继续。
感谢评论的人。
我正在调查一个问题,即我们的应用程序从 Oracle 数据库获取数据需要花费太多时间。在我的调查中,我发现查询的缓慢归因于 tables 之间的连接以及聚合函数 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) 是每次交货的总吨数。
我的table长得像
我在这个 table 中有 1600 万个条目,通过平均尝试多个 delivery_in_id,我得到大约 6 秒的查询时间。
我有类似的数据库(完整副本但只有 400 万个条目),当应用相同的查询时,我得到的时间不到 1 秒。 他们有相同的索引,所以我相信索引不是问题。
我确定它只是数据,它在第一个数据库(1600万)上很重。我有一种感觉,当这个查询被优化时,问题就会得到解决。 欢迎提出建议:)
这两个数据库是在同一个服务器上吗?如果不是,首先比较计算机配置、设置和 运行 应用程序。
如果没有差异,您可以尝试检查您要求和的列中是否有NULL 值。如果有的话,使用 NVL 函数来改进您的查询。
此外,您可以 "Analyse index"(或 "Rebuild Index")。它清理索引。 (这对您的数据来说非常快速和安全)。
如果没有帮助,请查看您的 table 的 TABLESPACE 是否未满。可能会有一些影响...但我不确定。
;-)
我已经通过更新存储过程解决了性能问题。通过在加入第二个 table 之前在第一个 table 中添加一个过滤器来优化它。下面是结果存储过程
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
timing/performance 中的结果对我来说很大,因为我加入了一个巨大的 table(16M)。这个查询现在进行不到一秒钟。缓慢,我怀疑是由于 1 table 没有索引(见 T1),即使在我的例子中它只有大约 20 个项目,它足以减慢查询速度,因为它将它与 1600 万个进行比较条目。 优化查询对这 1600 万进行过滤,然后合并到 T1。 是否应该有更好的方法来优化它?大概。但我对这个结果很满意,解决了我打算解决的问题。现在继续。 感谢评论的人。