暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

<优化专家系列>利用PL/SQL快速暴力测试Oracle优化器特性的版本变更

667

优化器变更测试

2019/12/22


在数据库升级中,版本的变更中,非常重要的一块变更即是优化器的变更。CBO是数据库运行的核心的大脑,它指挥着所有SQL的按正确的方式去获取数据(下图回顾了CBO的作用)。我们一般通过SPA,db replay等手段去确保数据库在升级以后,SQL能运行得更快更好,或者至少不能发生降级。



为什么需要暴力测试

2019/12/22


首先,98%以上的SQL都应该是通过统计的差异,数据量的差异等常规的途径判断,这是非常合理的升级路径。但是往往会存在一些疑难SQL,不管你这么调整统计信息的收集办法,也无法改变它在新版本下的行为,这个时候你就需要考虑是优化器本身的变更带来的变化了。

那么优化器的变更,在版本更迭中,影响大吗?

答案是比你想象中大,最近典型的从11.2 升级到19c,变化的_opt参数超过100个,和优化器相关的fix control超过300个。


如果DBA要手工去判断,是哪一个参数影响了SQL的执行计划的变化,是一个非常艰巨的任务。


但我们可以编写一段PL/SQL,快速完成所有的特性测试,直接告诉你结果。



测试SQL的执行计划变更是否由具体某个优化器特性(由隐藏的opt参数,或者fix control控制),从而制定针对性的优化手段。优化器参数有很多,如果手工测试,非常繁琐。利用脚本循环,可以一次测试完几百个特性的开关,找到对执行计划有影响的开关。

运行方式:

sqlplus as sysdba

set serveroutput on size unlimited

set linesize 333

spool r.txt

declare

sqlstr varchar2(3000):='select  * from dba_segments';  --替换要测试的sql

begin

  DBMS_WWJ_OPT.analyze_sql_optfeature(sqlstr,'12.2.0.1to11.2.0.4'); 

--选择合适的版本  目前最新修改为支持  12.2.0.1to11.2.0.4,  19.5.0.0to11.2.0.4, 另外还支持 9.2.0.8 to 11.2.0.3的远古版本

end;

/


部署:

在sys用户安装附件中的package

说明:

发生了变化


没有发现变化的,忽略


实现原理,在PLSQL中提前定义所有变化的,在session级别进行开关,然后对SQL做变更前后的explain plan的文本对比。


最后请各位专家发送邮件获取源代码。

valen.wang#??????.com



文章转载自西区O记重案实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论