升级执行计划比对

简介: --大概的思路是将生产和回放的执行计划放到临时表里面,然后比对执行计划的关键字段,计算相等行数,看看是否与生产执行计划的行数和回放执行计划的行数一样。--如果一样则认为执行计划相等。 --下面例子是:将SPA回放与生产抓取的STS的性能数据及执行计划比对的完整记录create table ...

--大概的思路是将生产和回放的执行计划放到临时表里面,然后比对执行计划的关键字段,计算相等行数,看看是否与生产执行计划的行数和回放执行计划的行数一样。
--如果一样则认为执行计划相等。

--下面例子是:将SPA回放与生产抓取的STS的性能数据及执行计划比对的完整记录


create table ly_compare_result_sts as
insert into ly_compare_result_sts
Select *
From (Select b.*, dbms_lob.substr(st.sql_text, 3000) sql_text

      From SYS.Wrh$_Sqltext st,
           (Select TASK_NAME,
                   sql_id,
                   bf_executions,
                   af_executions,
                   detal_buffer_gets,
                   bf_buffer_gets,
                   af_buffer_gets,
                   bf_plan_hash_value,
                   bf_ELAPSED_TIME,
                   af_ELAPSED_TIME,
                   bf_rows_processed,
                   af_plan_hash_value,
                   af_ROWS_PROCESSED
              From (Select TASK_NAME,
                           sql_id,
                           bf_executions,
                           af_executions,
                           bf_ELAPSED_TIME,
                           af_ELAPSED_TIME,
                           round(af_buffer_gets / af_EXECUTIONS) -
                           round(bf_buffer_gets / bf_executions) detal_buffer_gets,
                           round(bf_buffer_gets / bf_executions) bf_buffer_gets,
                           round(af_buffer_gets / af_EXECUTIONS) af_buffer_gets,
                           bf_plan_hash_value,
                           bf_rows_processed / bf_executions bf_rows_processed,
                           af_plan_hash_value,
                           af_ROWS_PROCESSED / af_EXECUTIONS af_ROWS_PROCESSED
                      From (Select bf.sqlset_name task_name ,
                                   bf.sql_id,
                                   bf.executions bf_executions,
                                   af.EXECUTIONS af_executions,
                                   af.ELAPSED_TIME af_ELAPSED_TIME,
                                   bf.ELAPSED_TIME bf_ELAPSED_TIME,
                                   bf.plan_hash_value bf_plan_hash_value,
                                   bf.buffer_gets bf_buffer_gets,
                                   bf.rows_processed bf_rows_processed,
                                   af.plan_hash_value af_plan_hash_value,
                                   af.BUFFER_GETS af_BUFFER_GETS,
                                   af.ROWS_PROCESSED af_ROWS_PROCESSED
                              From dba_sqlset_statements bf,
                                   dba_advisor_sqlstats af
                             Where af.execution_name = 'spa11g'
                               And af.task_name = 'TASK_11G'
                               And bf.sqlset_name = 'STS_UP11_0721'
                               ---and bf.task_name = 'TASK_10G_0719v1'
                               And bf.sql_id = af.sql_id))
             Where detal_buffer_gets > 0) b
     Where st.sql_id = b.sql_id
     Order By detal_buffer_gets Desc)

Where upper(sql_text) Not Like '%Analyze(%'
And upper(sql_text) Not Like '%SELECT / DS_SVC /%'
And upper(sql_text) Not Like '%/ OPT_DYN_SAMP /%'
and upper(sql_text) Not Like '%V$%'
and upper(sql_text) Not Like '%SYS.%'
and upper(sql_text) Not Like '%SYSTEM.%'
and upper(sql_text) Not Like '%FROM DUAL%'
and upper(sql_text) Not Like '%DBA_%'
and upper(sql_text) Not Like '%EXPLAIN PLAN%'

and upper(sql_text) Not Like '%FROM DUAL%';

delete from ly_compare_result_STS
where upper(sql_text) like '%ALL_SYNONYMS%'

or upper(sql_text) like  '%ALL_TABLES%'  ;

delete from ly_compare_result_STS s1
where EXISTS (
SELECT SS.sql_id FROM dba_sqlset_statements ss
where s1.sql_id = ss.sql_id
and ss.module = 'PL/SQL Developer' ) ;

commit;

-------------执行计划比对-----------------------------------------------------

create table ly_prod_plans as
select distinct p.sql_id, p.PLAN_HASH_VALUE , p.OPERATION, p.OPTIONS , p.OBJECT_OWNER , p.OBJECT_NAME ,p.OBJECT_ALIAS , p.OBJECT_TYPE ,

   p.ID, p.PARENT_ID , p.DEPTH , p.POSITION  

from v$sql_plan p
where p.PLAN_HASH_VALUE in ( 1425307179 ) ;

create index ind_ly_001 on ly_prod_plans (plan_hash_value, id);

select * from ly_prod_plans where 1=0 for update

select distinct t.bf_plan_hash_value ||',' from ly_compare_result_sts t

where not exists ( select 1 from ly_prod_plans t1 where t1.PLAN_HASH_VALUE = t.bf_plan_hash_value )

----1. 按照Sql_id, plan_hash_value导入生产的执行计划
----2. 对应不能按照sql_id导入的,可以单独按照plan_hash_value导入,sql_id is null
DROP TABLE ly_spa_plans PURGE ;
create table ly_spa_plans
as
--insert into ly_spa_plans
select distinct t1.sql_id, t1.plan_hash plan_hash_value ,

   p.OPERATION, p.OPTIONS , p.OBJECT_OWNER , p.OBJECT_NAME ,p.OBJECT_ALIAS , p.OBJECT_TYPE , 
   p.ID, p.PARENT_ID , p.DEPTH , p.POSITION  ---,  p.* 

from sys.wri$_adv_sqlt_plan_hash t1 , sys.WRI$_ADV_SQLT_PLANS p
where /*exec_name = 'spa10g_2'
and */t1.plan_id = p.plan_id
-- and t1.plan_hash = 294662549
and t1.sql_id in(
select sql_id from ly_compare_result_sts
)
order by t1.sql_id , p .id

create index ind_ly_002 on ly_spa_plans (plan_hash_value, id);

select * from ly_compare_result_sts ;

--drop table ly_compare_plans_result purge ;
-- truncate table ly_compare_plans_result ;

delete from ly_compare_plans_result where val <> prod_val ;

create table ly_compare_plans_result as
insert into ly_compare_plans_result
select bb.* ,cc.val prod_val ,'AO' remarks
from (
select s.sql_id, p.plan_hash_value sts_plan_hash_value, s.plan_hash_value spa_plan_hash_value ,count(1) val
from ly_prod_plans p , ly_spa_plans s
where p.operation = s.operation

and  nvl(p.options,'0') = nvl(s.options,'0')
--and  nvl(p.object_owner,'0') =nvl( s.object_owner ,'0')
and  nvl(p.object_name,'0')= nvl(s.object_name,'0')
--and  nvl(p.object_alias,'0') = nvl( s.object_alias,'0')
and  nvl(p.object_type,'0') = nvl( s.object_type,'0')
and  nvl(p.ID,-1) = nvl(s.id,-1) 
and  nvl(p.PARENT_ID,-1)  = nvl(s.PARENT_ID,-1) 
and  p.DEPTH = s.DEPTH  

-- and p.POSITION = s.POSITION
group by p.plan_hash_value , s.plan_hash_value , s.sql_id
) bb , (
select plan_hash_value , count(1) val from ly_prod_plans p
group by plan_hash_value
) cc ,ly_compare_result_STS1 t
where bb.sts_plan_hash_value = cc.plan_hash_value
and t.sts_plan_hash = bb.sts_plan_hash_value (+)
and t.spa_plan_hash = bb.spa_plan_hash_value (+)
and t.sql_id = bb.sql_id (+)
and not exists (

  select 1 from ly_compare_plans_result tt 
  where/* t.sql_id = tt.sql_id and*/ tt.sts_plan_hash_value = bb.sts_plan_hash_value and  tt.spa_plan_hash_value = bb.spa_plan_hash_value ) ;
   

update ly_compare_result_STS1 t1
set t1.ppcompr = 'Same'
where exists ( select 'Same' from ly_compare_plans_result t
where / t.sql_id = t1.sql_id and/ t.sts_plan_hash_value = t1.sts_plan_hash and t.spa_plan_hash_value = t1.spa_plan_hash and t.val = t.prod_val ) ;


select t.sqlset_name , t.sql_id, t.sts_plan_hash sts_plan_hash_value , t.spa_plan_hash spa_plan_hash_value ,

  b.val , ( select count(1) from ly_prod_plans  p where p.plan_hash_value = t.sts_plan_hash ) sts_val 

from (
select p.plan_hash_value sts_plan_hash_value, s.sql_id ,s.plan_hash_value spa_plan_hash_value /, p.operation/ ,count(1) val
from ly_prod_plans p , ly_spa_plans s
where p.operation = s.operation
and nvl(p.options,'0') = nvl(s.options,'0')
--and nvl(p.object_owner,'0') =nvl( s.object_owner ,'0')
and nvl(p.object_name,'0')= nvl(s.object_name,'0')
--and nvl(p.object_alias,'0') = nvl( s.object_alias,'0')
and nvl(p.object_type,'0') = nvl( s.object_type,'0')
and nvl(p.ID,-1) = nvl(s.id,-1)
and nvl(p.PARENT_ID,-1) = nvl(s.PARENT_ID,-1)
and p.DEPTH = s.DEPTH
group by p.plan_hash_value , s.plan_hash_value , s.sql_id) b ,ly_compare_result_STS t
where t.sts_plan_hash = b.sts_plan_hash_value (+)
and t.spa_plan_hash = b.spa_plan_hash_value (+)
and t.sql_id = b.sql_id (+)
and t.sql_id ='f704udb3va1v9' ;

select * from ly_compare_result_STS t where sql_id ='f704udb3va1v9' ;

select p.OPERATION, p.OPTIONS , p.OBJECT_OWNER , p.OBJECT_NAME ,p.OBJECT_ALIAS , p.OBJECT_TYPE ,

   p.ID, p.PARENT_ID , p.DEPTH   from ly_prod_plans   p where plan_hash_value in (2256942569 ,  2872682413 ) 

union all
select distinct p.OPERATION, p.OPTIONS , p.OBJECT_OWNER , p.OBJECT_NAME ,p.OBJECT_ALIAS , p.OBJECT_TYPE ,

   p.ID, p.PARENT_ID , p.DEPTH  from ly_spa_plans p where  plan_hash_value in   (2256942569 ,  2872682413 )  
目录
相关文章
|
存储 SQL 负载均衡
列式存储引擎分析比对
列式存储具有高压缩率、利于列裁剪、以及高CPU计算效率(Cache Friendly)等特点,是分析型业务场景所选择的主流数据存储方案。 本文介绍了工业界一些常见的面向OLAP或HTAP场景数据库的列存存储引擎设计思路,并进行了总结和对比。
2782 3
|
3月前
|
SQL 数据处理 数据库
SQL进阶之路:深入解析数据更新与删除技巧——掌握批量操作、条件筛选、子查询和事务处理,提升数据库维护效率与准确性
【8月更文挑战第31天】在数据库管理和应用开发中,数据的更新和删除至关重要,直接影响数据准确性、一致性和性能。本文通过具体案例,深入解析SQL中的高级更新(UPDATE)和删除(DELETE)技巧,包括批量更新、基于条件的删除以及使用子查询和事务处理复杂场景等,帮助读者提升数据处理能力。掌握这些技巧能够有效提高数据库性能并确保数据一致性。
78 0
|
4月前
|
SQL 关系型数据库 MySQL
PolarDB产品使用问题之搜索和查询冷数据如何照时间范围进行查询
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL Arthas druid
MyBtais 批量插入慢排查及分析(后续)
MyBtais 批量插入慢排查及分析(后续)
184 0
|
存储 Oracle 关系型数据库
FAQ系列 | EXPLAIN执行计划中要重点关注哪些要素
FAQ系列 | EXPLAIN执行计划中要重点关注哪些要素
|
存储 SQL 分布式计算
多场景查询分析
多场景查询分析
147 0
|
SQL 新零售 存储
让SQL优化器更准确!AnalyticDB PG版发布统计信息自动收集功能
本次发布的 Auto Analyze 功能解决了在 ADB PG 实例使用过程中,由于未能及时执行 ANALYZE 收集统计信息导致了 CBO 优化器生成计划退化进而导致业务分析变慢的问题。
1007 0
让SQL优化器更准确!AnalyticDB PG版发布统计信息自动收集功能
|
SQL 算法 索引
SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)
原文:SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)   本文出处:http://www.cnblogs.com/wy123/p/6008477.html    关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里。
1045 0

相关实验场景

更多
下一篇
无影云桌面