[20241013]记录一条sql语句优化.txt --//昨天别人想通过dbms_shared_pool.keep减少硬分析,我昨晚看了其sql语句,实际上该语句与以前生产系统的语句类似。 --//正好在21c下可以重复这个现象,做一个优化分析: 1.环境: SCOTT@book01p> @ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. Elapsed: 00:00:00.02 $ cat a1.txt SELECT D.constraint_type as CONSTRAINT_TYPE, C.COLUMN_NAME, C.position, D.r_constraint_name, E.table_name as table_ref, f.column_name as column_ref, C.table_name FROM ALL_CONS_COLUMNS C inner join ALL_constraints D on D.OWNER = C.OWNER and D.constraint_name = C.constraint_name left join ALL_constraints E on E.OWNER = D.r_OWNER and E.constraint_name = D.r_constraint_name left join ALL_cons_columns F on F.OWNER = E.OWNER and F.constraint_name = E.constraint_name and F.position = c.position WHERE C.OWNER = 'SCOTT' and C.table_name = 'EMP' and D.constraint_type <> 'P' order by d.constraint_name, c.position; --//与我生产系统类似,仅仅传入的参数我修改一下,这类语句往往是某个程序递归执行的,实际的执行计划超级复杂。 2.测试: --//执行多次。 SCOTT@book01p> set timing on SCOTT@book01p> column TABLE_REF format a20 SCOTT@book01p> column COLUMN_REF format a20 SCOTT@book01p> @ a1.txt C COLUMN_NAME POSITION R_CONSTRAINT_NAME TABLE_REF COLUMN_REF TABLE_NAME - ------------------------------ ---------- ------------------------------ -------------------- -------------------- ------------------------------ R DEPTNO 1 PK_DEPT DEPT DEPTNO EMP Elapsed: 00:00:02.02 SCOTT@book01p> @ a1.txt C COLUMN_NAME POSITION R_CONSTRAINT_NAME TABLE_REF COLUMN_REF TABLE_NAME - ------------------------------ ---------- ------------------------------ -------------------- -------------------- ------------------------------ R DEPTNO 1 PK_DEPT DEPT DEPTNO EMP Elapsed: 00:00:02.05 --//每次执行需要2秒。 SCOTT@book01p> @ hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 1379538955 49hn4n193n60b 0 6155 754505174 523a180b 2024-10-13 12:41:27 16777232 SYS@book> @ cr_s PL/SQL procedure successfully completed. --//执行dbms_workload_repository.create_snapshot()建立awr报表,不然sqlhh查询不到结果。 SYS@book> @ sqlhh 49hn4n193n60b 1 time unit : millisecond BEGIN_INTERVAL_TIME INST_ID SQL_ID PLAN_HASH_VALUE EXECUTIONS ELA_MS_PER_EXEC CPU_MS_PER_EXEC ROWS_PER_EXEC LIOS_PER_EXEC BLKRD_PER_EXEC IOW_MS_PER_EXEC AVG_IOW_MS CLW_MS_PER_EXEC APW_MS_PER_EXEC CCW_MS_PER_EXEC ------------------- ---------- ------------- --------------- ---------- --------------- --------------- ------------- ------------- -------------- --------------- ----------- --------------- --------------- --------------- 2024-10-13 10:58:28 1 49hn4n193n60b 754505174 13 1794 1789 1.0 3119 0 0 0.0 0 0 0 SYS@book> @ gunshare 49hn4n193n60b --- host vim /tmp/unshare.tmp --- host cat /tmp/unshare.tmp REASON_NOT_SHARED CURSORS SQL_IDS ----------------------------- ---------- ---------- OPTIMIZER_MISMATCH 13 1 --//执行13次,每次都产生子光标并且都不共享,实际上每次都是1次硬分析,而执行计划很复杂,这样分析时间很长就很正常。 --//这才是对方遇到的问题本质,通过dbms_shared_pool.keep自然不起作用,实际上这是执行计划adaptive导致的问题,执行计划 --//note部分提示 this is an adaptive plan,以前11g没有这个特性,自然没有这个问题。 SYS@book> @ ashtop event,time_model_name sql_id='49hn4n193n60b' &day Total Distinct Distinct Distinct Seconds AAS %This EVENT TIME_MODEL_NAME FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- --------------- ----------------- ------------------- ------------------- ---------- -------- ----------- 34 .0 100% | PARSE HARD_PARSE 2024-10-13 11:36:11 2024-10-13 12:41:29 1 34 34 --//time_model_name模型也提示主要消耗在分析上。只要sql profile稳定执行计划就ok了。 SYS@book> @ spsw 49hn4n193n60b 0 49hn4n193n60b 0 '' true PL/SQL procedure successfully completed. ================================================================================================================================================= if drop or alter sql profile ,run : execute dbms_sqltune.drop_sql_profile(name => 'switch tuning 49hn4n193n60b') execute dbms_sqltune.alter_sql_profile(name => 'switch tuning 49hn4n193n60b',attribute_name=>'STATUS',value=>'DISABLED') ================================================================================================================================================= --//感觉应该在pdb下执行。 SYS@book> execute dbms_sqltune.drop_sql_profile(name => 'switch tuning 49hn4n193n60b') PL/SQL procedure successfully completed. --//确实如此!!重复执行查看执行计划note部分没有提示使用sql profile。 --//改在pdb下执行: SYS@book01p> @ spsw 49hn4n193n60b 0 49hn4n193n60b 0 '' true PL/SQL procedure successfully completed. ================================================================================================================================================= if drop or alter sql profile ,run : execute dbms_sqltune.drop_sql_profile(name => 'switch tuning 49hn4n193n60b') execute dbms_sqltune.alter_sql_profile(name => 'switch tuning 49hn4n193n60b',attribute_name=>'STATUS',value=>'DISABLED') ================================================================================================================================================= SCOTT@book01p> @ a1.txt C COLUMN_NAME POSITION R_CONSTRAINT_NAME TABLE_REF COLUMN_REF TABLE_NAME - ------------------------------ ---------- ------------------------------ -------------------- -------------------- ------------------------------ R DEPTNO 1 PK_DEPT DEPT DEPTNO EMP Elapsed: 00:00:00.37 SCOTT@book01p> @ a1.txt C COLUMN_NAME POSITION R_CONSTRAINT_NAME TABLE_REF COLUMN_REF TABLE_NAME - ------------------------------ ---------- ------------------------------ -------------------- -------------------- ------------------------------ R DEPTNO 1 PK_DEPT DEPT DEPTNO EMP Elapsed: 00:00:00.10 --//现在很快返回,问题解决。 --//这种情况使用sql profile方法来稳定执行计划方法简单实用。
[20241013]记录一条sql语句优化.txt
来源:这里教程网
时间:2026-03-03 20:42:02
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 达梦数据库安装与配置
达梦数据库安装与配置
26-03-03 - 数据库管理-第248期 23ai:全球分布式数据库-分片数据分布方法(20241006)
- Oracle这款免费的代码平台,铁了心砸掉程序员饭碗!
Oracle这款免费的代码平台,铁了心砸掉程序员饭碗!
26-03-03 - 使用Oracle 19c,必须要注意这个Bug
使用Oracle 19c,必须要注意这个Bug
26-03-03 - 数据库管理-第249期 23ai:全球分布式数据库-请求路由与查询过程(20241008)
- 推荐几本学习Oracle初期阅读的书
推荐几本学习Oracle初期阅读的书
26-03-03 - oracle数据坏块处理(一)-通过rman备份修复
oracle数据坏块处理(一)-通过rman备份修复
26-03-03 - golden gate目录从standby端迁移到primary端
golden gate目录从standby端迁移到primary端
26-03-03 - Oracle数据恢复—异常断电导致Oracle数据库数据库打不开的数据恢复案例
- 数据库管理-第244期 一次无法switchover的故障处理(20240928)
