SQL 分析

初步沟通后得知,开发人员通过应用日志监控到某条 SQL 执行时间显著增加,导致接口超时,进而影响业务流程。

首先,通过 SQLID 3jm7s0g3w2px0 获取该 SQL 的 AWR SQL 报告(awrsqrpt)。当然,也可以使用 dbms_xplan.display_cursor 来获取执行计划:

 

SELECT * FROM TABLE(dbms_xplan.display_cursor('3jm7s0g3w2px0', NULL));

通过 AWR SQL 报告分析,可以发现该 SQL 存在两个执行计划:

慢的执行计划采用了全表扫描方式:

从等待可以看出,SQL 执行时间主要消耗在 I/O 等待上:

快的执行计划则使用了索引访问:

索引访问的 I/O 等待明显减少:

基于经验判断,这很可能是由于执行计划选择错误导致的性能问题,解决方向是固定最优执行计划。

固定执行计划

可以使用 coe_xfr_sql_profile 脚本来固定执行计划:

 

-- 参数1:SQL_ID,参数2:需要绑定的执行计划哈希值 SQL> @coe_xfr_sql_profile 3jm7s0g3w2px0 1000005031

执行后会在当前目录生成 coe_xfr_sql_profile_3jm7s0g3w2px0_1000005031.sql 脚本,执行该脚本即可完成执行计划绑定:

 

SQL> @coe_xfr_sql_profile_3jm7s0g3w2px0_1000005031

验证绑定结果:

 

SQL> SET lines 222 PAGES 1000 COL name FOR a60 COL status FOR a10 COL type FOR a10 SELECT name, status, created, type FROM dba_sql_profiles; NAME STATUS CREATED TYPE ------------------------------------------------------------ ---------- --------------------------------------------------------------------------- ---------- coe_3jm7s0g3w2px0_1000005031 ENABLED 27-NOV-25 03.08.33.103163 PM MANUAL

执行计划绑定后,开发反馈 SQL 执行速度恢复正常,接口不再超时,产线业务得以恢复。

https://www.modb.pro/db/1993940358913417216

https://www.modb.pro/doc/147813

更多推荐