请帮助优化查询

Posted

技术标签:

【中文标题】请帮助优化查询【英文标题】:Please help to optimise the query 【发布时间】:2019-08-16 15:11:01 【问题描述】:

我是 sql 查询的新手。下面的 sql 查询需要将近 4 分钟才能运行,因为哪个页面停留了这么长时间。我们需要优化这个查询,以便用户不会停留这么长时间

请帮助优化。

我们正在使用 oracle 数据库

【问题讨论】:

我们对您的数据或表结构或索引等一无所知。您应该从查看执行计划开始。您将旧式连接(逗号分隔的表)与 ANSI 连接混合在一起,这会让人难以理解并且可能会破坏事情,但也可能会使优化器感到困惑,因为它会限制可能发生的连接顺序;所以也许在你深入挖掘之前解决这个问题。 【参考方案1】:

可以通过在aaa_soldto_xyz 表中添加 2 个预先计算的列来进行一些改进:

aaa_soldto_xyz.ID1 = Substr(aaa_soldto_xyz.xyz_id, 0, 6)

aaa_soldto_xyz.ID2 = Substr(aaa_soldto_xyz.xyz_id, 1, Length ( aaa_soldto_xyz.xyz_id) - 5) )

那些可以更好地利用现有或新的索引。

【讨论】:

【参考方案2】:

如果没有解释计划,我们无法帮助您优化查询。

但这个查询需要明显的改进是:从子查询中删除abc_customer_address表(选择子句)并从列表中左连接并检查结果。

您需要更改以下条款。

从子句

Left join (SELECT ADDR.zip_code, 
ADDR.ID, 
ROW_NUMBER() OVER (PARTITION BY ADDR.ID ORDER BY 1) AS RN                                                     
FROM abc_customer_address ADDR                                                          
WHERE  ADDR.id = abc_customer.billing                                                              ) ADDR 
ON (ADDR.id = abc_customer.billing AND ADDR.RN = 1)

选择子句:

CASE WHEN abc_customer_address.zip_code IS NULL THEN ADDR.zip_code
ELSE abc_customer_address.zip_code 
END AS ZIP_CODE, 

干杯!!

【讨论】:

Thnx Tejaash,我会检查 我已经更新了 from 子句。在 row_number 中添加了 partition by 子句。请使用最新的代码

以上是关于请帮助优化查询的主要内容,如果未能解决你的问题,请参考以下文章

需要优化查询

优化 SQL 查询以减少执行时间

需要优化 mssql 查询以获得最快的速度

需要帮助优化一个有趣的 MySQL 查询

SQL查询优化帮助

需要帮助来优化 ORACLE SQL 查询 [关闭]