注:转自http://blog.csdn.net/wish503/article/details/52066944

------------------------------------------------------
--Step1: 创建名称为STS_NAME_TEST 的SQL_SET.
---------------------------------------------------
BEGIN
DBMS_SQLTUNE.CREATE_SQLSET(SQLSET_NAME => 'STS_NAME_TEST',
          DESCRIPTION => 'COMPLETE APPLICATION WORKLOAD',
          SQLSET_OWNER =>'TEST');
END;
/

--------------------------------------------------
--Step2: 初始加载当前数据库中的SQL.
---------------------------------------------------
DECLARE
   STSCUR   DBMS_SQLTUNE.SQLSET_CURSOR;
   v_cnt    NUMBER;
BEGIN
 OPEN STSCUR FOR
   SELECT VALUE (P)
    FROM TABLE (
    DBMS_SQLTUNE.SELECT_CURSOR_CACHE (
     '(lower(sql_text) LIKE ''%table_name%''
           ) and PARSING_SCHEMA_NAME <> ''SYS''',
          'ALL')) P;
   -- POPULATE THE SQLSET
  DBMS_SQLTUNE.LOAD_SQLSET (SQLSET_NAME       => 'STS_NAME_TEST',
                            POPULATE_CURSOR   => STSCUR,
                             commit_rows       => 100,
                             SQLSET_OWNER      => 'TEST');
  CLOSE STSCUR;
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      RAISE;
END;
/

--------------------------------------------------
--Step3: 增量抓取数据库中的SQL, 会连续抓取三天,每小时抓取一次,在后台执行
---------------------------------------------------
--1编辑sql文件
vi getsql_TEST.sql

BEGIN
  DBMS_SQLTUNE.CAPTURE_CURSOR_CACHE_SQLSET(SQLSET_NAME=>''STS_NAME_TEST'',
    TIME_LIMIT=> 259200,                          
    REPEAT_INTERVAL=>3600,                          
    CAPTURE_OPTION=>'MERGE',                          
    CAPTURE_MODE =>DBMS_SQLTUNE.MODE_ACCUMULATE_STATS, 
    BASIC_FILTER=>
     '(lower(sql_text) LIKE ''%table_name%'') and PARSING_SCHEMA_NAME <> ''SYS''',
       SQLSET_OWNER => 'TEST');                          
    END;
/

--2编辑shell脚本
vi getsql_TEST.sh
#!/bin/ksh
sqlplus '/as sysdba' << EOF 
@getsql_TEST.sql
exit
EOF

--3后台执行脚本
nohup sh getsql_TEST.sh &

-------------------------
BSCOW,创建中间表
-------------------------
Begin
     dbms_sqltune.create_stgtab_sqlset(table_name => 'STGTAB_TEST' ,schema_name => 'TEST');
End;
/

---------------------------
BSCOW,将sqlset打包到中间表
---------------------------
Begin
 dbms_sqltune.pack_stgtab_sqlset(sqlset_name =>'STS_NAME_TEST',sqlset_owner =>'TEST',
 staging_table_name =>'STGTAB_TEST' ,staging_schema_owner => 'TEST' );
End;
/

-----------------
BSCOW,导出中间表
-----------------
exp STGTAB_TEST

--------------------------------------------
中间库,创建到部署cow的db_link,导入SQL,去重
--------------------------------------------
create public database link to_dbname connect to TEST identified by XXXX 
using 'DBNAME';

imp STGTAB_TEST

--按照plan_hash_value;
begin
for v in (
select plan_hash_value,count(*) cnt from TEST.STGTAB_TEST  group by plan_hash_value) loop
while(v.cnt>1) loop
delete from TEST.STGTAB_TEST a where a.plan_hash_value =v.plan_hash_value and rownum=1;
v.cnt:=v.cnt-1;
end loop;
commit;
end loop;
end;
/

--按照hash_value:
begin
for v in (
select hash_value,count(*) cnt from TEST.STGTAB_TEST  group by hash_value) loop
while(v.cnt>1) loop
delete from TEST.STGTAB_TEST a where a.hash_value =v.hash_value and rownum=1;
v.cnt:=v.cnt-1;
end loop;
commit;
end loop;
end;
/

-------------------------------------------------
中间库,对中间表进行解包,将sql导入到目标端sqlset
-------------------------------------------------

update TEST.STGTAB_TEST set owner='TEST';

Begin
   dbms_sqltune.unpack_stgtab_sqlset(sqlset_name => 'STS_NAME_TEST',sqlset_owner => 'TEST'  ,replace => TRUE,staging_table_name =>'STGTAB_TEST' ,staging_schema_owner => 'TEST');
End;
/

------------------
中间库,过滤sqlset
-----------------
begin
  DBMS_SQLTUNE.DELETE_SQLSET(sqlset_name => 'STS_NAME_TEST',basic_filter => 'SQL_TEXT LIKE ''%Analyze(%''',sqlset_owner => 'TEST');
END;
/
(把sqlset中的analyze语句去掉,这种语句非业务语句)
select sql_text from dba_sqlset_statements where sqlset_name='STS_NAME_TEST';(查询sqlset中的sql语句)

--------------
BSCOW,增加授权
--------------
grant execute on SYS.DBMS_SQLPA to TEST;

------------------------
中间库,创建spa task
---------------------
使用devmgr用户创建SPA任务,后续执行SPA任务也使用test用户:
需要在中间库对test用户授权:
grant execute on SYS.dbms_sqlpa to TEST;
conn TEST/xxxxxx
declare
  mytask varchar2(100);
begin
  mytask := dbms_sqlpa.create_analysis_task(sqlset_name => 'STS_NAME_TEST',
                                            task_name   => 'task_test01');
END;
/

-----------
中间库,查询task是否创建成功
----------
Select * From Dba_Advisor_Tasks Where task_name='task_test01';
select TASK_ID,owner,TASK_NAME,status from dba_advisor_tasks where task_name='task_test01';

-----------------------------------------------
中间库,执行spa task,生成性能测试基线,后台执行,参数可能还需要考虑下任务里sql的执行次数以及对执行耗时长的sql的处理
-----------------------------------------------
sqlplus TEST/ptmjygb8 <<EOF

begin
  dbms_sqlpa.execute_analysis_task(task_name        => 'task_test01',
                                   execution_type   => 'TEST EXECUTE',
                                   execution_name   => 'exec01',
                                   execution_params => dbms_advisor.argList('DATABASE_LINK','TO_DBNAME','EXECUTE_COUNT',3,'LOCAL_TIME_LIMIT','300'),
                                   execution_desc   => 'executeion on 11g');
end;
/
EOF

-----------------------
中间库,查询基线进度
-----------------------
SELECT owner,task_name,execution_name,a.execution_type,execution_start,execution_last_modified,execution_end,status,b.SOFAR,b.START_TIME,b.LAST_UPDATE_TIME
from  dba_advisor_executions a,  v$advisor_progress b where TASK_NAME='task_test01' and a.task_id=b.TASK_ID;

------------------
BSCOW,执行变更
------------------
比如对表收集统计信息,新建索引等。

--------------------------------------
中间库,第二次执行spa task,后台执行
-------------------------------------
sqlplus TEST/ptmjygb8 <<EOF
begin
  dbms_sqlpa.execute_analysis_task(task_name        => 'task_test01',
                                   execution_type   => 'TEST EXECUTE',
                                   execution_name   => 'exec02',
                                   execution_params => dbms_advisor.argList(
'DATABASE_LINK','TO_RSAPPCOW','EXECUTE_COUNT',3,'LOCAL_TIME_LIMIT','300'),
                                   execution_desc   => 'executeion on 10g');
end;
/
EOF

——保留相关报错信息
create table Dba_Advisor_Objects_old as select * from Dba_Advisor_Objects;
create table Dba_Advisor_Findings_old as select * from Dba_Advisor_Findings;
--保留参数信息
create table dba_advisor_parameters_old as select * from dba_advisor_parameters;
create table Dba_Advisor_Executions_old as select * from Dba_Advisor_Executions;
--保留性能数据
create table dba_advisor_sqlstats_old as select * from dba_advisor_sqlstats;
create table dba_advisor_sqlplans_old as select * from dba_advisor_sqlplans;

---------------
中间库,分析结果
----------------
--执行计划改变的SQL
Select st.sql_id,
       sst.executions,
       dbms_lob.substr(st.sql_text, 3000) sql_text
  From sys.wrh$_sqltext st,
       dba_sqlset_statements sst,
       (Select Distinct sql_id
          From (Select sql_id,
                       operation,
                       options,
                       object_name,
                       object_alias,
                       object_type,
                       Id,
                       parent_id,
                       depth
                  From dba_advisor_sqlplans
                 Where execution_name = 'exec02'
                   And task_name = 'task_test01'
                Minus
                Select sql_id,
                       operation,
                       options,
                       object_name,
                       object_alias,
                       object_type,
                       Id,
                       parent_id,
                       depth
                  From dba_advisor_sqlplans
                 Where execution_name = 'exec01'
                   And task_name = 'task_test01')) cp
 Where st.sql_id = cp.sql_id
   And sst.sql_id = cp.sql_id
   And st.sql_text Not Like '%Analyze(%'
   And st.sql_text Not Like '%SELECT /* DS_SVC */%'
   And st.sql_text Not Like '%/* OPT_DYN_SAMP */%'
   And sst.sqlset_name = 'STS_NAME0314';
   
--以Buffer_Gets作为比较条件,获取性能数据进行比对
Select *
  From (Select b.*, dbms_lob.substr(st.sql_text, 3000) sql_text
          From SYS.Wrh$_Sqltext st,
               (Select TASK_NAME,
                       sql_id,
                       executions,
                       detal_buffer_gets,
                       bf_buffer_gets,
                       af_buffer_gets,
                       bf_plan_hash_value,
                       bf_rows_processed,
                       af_plan_hash_value,
                       af_ROWS_PROCESSED
                  From (Select TASK_NAME,
                               sql_id,
                               bf_executions executions,
                               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.TASK_NAME,
                                       bf.sql_id,
                                       bf.executions bf_executions,
                                       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.EXECUTIONS af_EXECUTIONS,
                                       af.ROWS_PROCESSED af_ROWS_PROCESSED
                                  From dba_advisor_sqlstats  af,
                                       dba_advisor_sqlstats bf
                                 Where af.execution_name = 'exec02'
                                   And af.task_name = 'task_test01'
                                   And bf.execution_name = 'exec01'
                                   and bf.task_name = 'task_test01'
                                   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 sql_text Not Like '%Analyze(%'
   And sql_text Not Like '%SELECT /* DS_SVC */%'
   And sql_text Not Like '%/* OPT_DYN_SAMP */%';
   
--以elapsed_time作为比较条件获取性能数据进行比对
Select *
  From (Select b.*, dbms_lob.substr(st.sql_text, 3000) sql_text
          From SYS.Wrh$_Sqltext st,
               (Select TASK_NAME,
                       sql_id,
                       executions,
                       detal_elapsed_time,
                       bf_elapsed_time,
                       af_elapsed_time,
                       bf_plan_hash_value,
                       bf_rows_processed,
                       af_plan_hash_value,
                       af_ROWS_PROCESSED
                  From (Select TASK_NAME,
                               sql_id,
                               bf_executions executions,
                               round(af_elapsed_time / af_EXECUTIONS) -
                               round(bf_elapsed_time / bf_executions) detal_elapsed_time,
                               round(bf_elapsed_time / bf_executions) bf_elapsed_time,
                               round(af_elapsed_time / af_EXECUTIONS) af_elapsed_time,
                               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.TASK_NAME,
                                       bf.sql_id,
                                       bf.executions bf_executions,
                                       bf.plan_hash_value bf_plan_hash_value,
                                       bf.elapsed_time bf_elapsed_time,
                                       bf.rows_processed bf_rows_processed,
                                       af.plan_hash_value af_plan_hash_value,
                                       af.elapsed_time af_elapsed_time,
                                       af.EXECUTIONS af_EXECUTIONS,
                                       af.ROWS_PROCESSED af_ROWS_PROCESSED
                                  From dba_advisor_sqlstats  af,
                                       dba_advisor_sqlstats bf
                                 Where af.execution_name = 'exec02'
                                   And af.task_name = 'task_test01'
                                   And bf.execution_name = 'exec01'
                                   and bf.task_name = 'task_test01'
                                   And bf.sql_id = af.sql_id))
                 Where detal_elapsed_time > 0) b
         Where st.sql_id = b.sql_id
         Order By detal_elapsed_time Desc)
 Where sql_text Not Like '%Analyze(%'
   And sql_text Not Like '%SELECT /* DS_SVC */%'
   And sql_text Not Like '%/* OPT_DYN_SAMP */%';

ORACLE SPA的更多相关文章

  1. Oracle SPA取报告阶段xml解析失败解决方案

    SPA的整体测试过程可以参考: 记录一则完整的SPA(10g->11g)测试过程 故障描述:数据库字符集:US7ASCII,在SPA分析阶段正常,但在取报告阶段xml解析失败,具体现象如下: S ...

  2. 转://Oracle数据库升级后保障SQL性能退化浅谈

    一.数据库升级后保障手段 为了保障从10.2.0.4版本升级到11.2.0.4版本更加平稳,我们事先采用了oracle性能分析器(SQL Performance Analyzer)来预测数据库的关键S ...

  3. 11g SPA (sql Performance Analyze) 进行升级测试

    注;转自http://ju.outofmemory.cn/entry/77139 11G的新特性SPA(SQL Performance Analyze)现在被广泛的应用到升级和迁移的场景.当然还有一些 ...

  4. 关于Oracle开启自动收集统计信息的SPA测试

    主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...

  5. Oracle通过sqlplus spool导入导出数据

    第一部分(实例,主要分两步),第二部分(参数小总结),第三部分(完全参数总结) 第一部分 第一步 :这是我的导出数据的脚本call.sqlconn scott/tigerset echo offset ...

  6. 实战:ORACLE SQL Performance Analyzer

    通过 SPA,您能够依据各种更改类型(如初始化參数更改.优化器统计刷新和数据库升级)播放特定的 SQL 或整个 SQL 负载,然后生成比較报告,帮助您评估它们的影响. 在 Oracle Databas ...

  7. Oracle SQL tuning 步骤

    Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语 ...

  8. [整理]:oracle spool 用法

    本文来自iDB Stock:http://www.idb-stock.net/idb/2011/06/01/153.html 1.spool的作用是什么? spool的作用可以用一句话来描述:在sql ...

  9. oracle 之数据字典屣履造门。

     oracle 之数据字典屣履造门.(更新中)       今天是2013-06-20,哎,写这篇笔记的时候,我发现我是一个非常懒惰的人,这篇文章本该昨天就完成的,想起了钱鹤滩的<明日歌> ...

随机推荐

  1. 学会JavaScript函数式编程(第1部分)

    摘要: JS函数式编程入门. 原文:学会使用函数式编程的程序员(第1部分) 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 在这篇由多部分组成的文章中,接下来将介绍函数式编程的一些概念 ...

  2. LNMP环境下安装Redis,以及php的redis扩展

    1.下载 sudo wget http://download.redis.io/releases/redis-4.0.9.tar.gz 2.解压 sudo tar zvxf redis-4.0.9.t ...

  3. 小tips:JS语法之标签(label)

    JavaScript语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下. label: statement 标签可以是任意的标识符,但是不能是保留字,语句 ...

  4. HDU1521 排列组合(生成函数 背包)

    题意 链接 Sol 可以用生成函数做,也可以用组合数做. 生成函数就是无脑算一下阶乘暴力背包,然后最后再乘上\(M\)的阶乘 组合数的方法就是用类似背包的转移,转移的时候考虑当前放的这几个的方案数即可 ...

  5. 洛谷P4561 [JXOI2018]排序问题(二分 期望)

    题意 题目链接 Sol 首先一种方案的期望等于它一次排好的概率的倒数. 一次排好的概率是个数数题,他等于一次排好的方案除以总方案,也就是\(\frac{\prod cnt_{a_i}!}{(n+m)! ...

  6. getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()

    一.getCacheDir.getCacheDir getCacheDir()方法用于获取/data/data//cache目录 getFilesDir()方法用于获取/data/data//file ...

  7. Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)

    1.传入年龄段,两个值,一个最小值,一个最大值,然后获取该年龄段的两个时间戳: (1)处理时间方法: /** * 根据年龄获取时间戳(开始年龄key取0,返回一年最后一秒时间戳,时间戳大:反之结束年龄 ...

  8. git上传中的排除的配置文件, git实际的操作代码;

    git上传中的排除的配置文件: git实际的操作 在主目录建立.gitignore文件并输入以下保存: *.class #package file *.war *.ear #kdiff3 ignore ...

  9. (其他)用sublime text3编写的html网页用浏览器打开出现中文乱码的原理及解决方法(转)

    最近发现Hbuler比较难用,换成sublime text3了,用了以前没用过的软件,就要学习他的操作,刚上手就出了点问题. 解决方法就是sublime text3以utf8 with bom保存. ...

  10. java 获取当前系统可用字体名称

    //获取系统的字体 public static void getLocalFontFamily(){ GraphicsEnvironment ge=GraphicsEnvironment.getLoc ...