ORACLE SPA
注:转自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的更多相关文章
- Oracle SPA取报告阶段xml解析失败解决方案
SPA的整体测试过程可以参考: 记录一则完整的SPA(10g->11g)测试过程 故障描述:数据库字符集:US7ASCII,在SPA分析阶段正常,但在取报告阶段xml解析失败,具体现象如下: S ...
- 转://Oracle数据库升级后保障SQL性能退化浅谈
一.数据库升级后保障手段 为了保障从10.2.0.4版本升级到11.2.0.4版本更加平稳,我们事先采用了oracle性能分析器(SQL Performance Analyzer)来预测数据库的关键S ...
- 11g SPA (sql Performance Analyze) 进行升级测试
注;转自http://ju.outofmemory.cn/entry/77139 11G的新特性SPA(SQL Performance Analyze)现在被广泛的应用到升级和迁移的场景.当然还有一些 ...
- 关于Oracle开启自动收集统计信息的SPA测试
主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...
- Oracle通过sqlplus spool导入导出数据
第一部分(实例,主要分两步),第二部分(参数小总结),第三部分(完全参数总结) 第一部分 第一步 :这是我的导出数据的脚本call.sqlconn scott/tigerset echo offset ...
- 实战:ORACLE SQL Performance Analyzer
通过 SPA,您能够依据各种更改类型(如初始化參数更改.优化器统计刷新和数据库升级)播放特定的 SQL 或整个 SQL 负载,然后生成比較报告,帮助您评估它们的影响. 在 Oracle Databas ...
- Oracle SQL tuning 步骤
Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语 ...
- [整理]:oracle spool 用法
本文来自iDB Stock:http://www.idb-stock.net/idb/2011/06/01/153.html 1.spool的作用是什么? spool的作用可以用一句话来描述:在sql ...
- oracle 之数据字典屣履造门。
oracle 之数据字典屣履造门.(更新中) 今天是2013-06-20,哎,写这篇笔记的时候,我发现我是一个非常懒惰的人,这篇文章本该昨天就完成的,想起了钱鹤滩的<明日歌> ...
随机推荐
- C#设计模式之八装饰模式(Decorator Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第三个模式,该模式是[装饰模式],英文名称:Decorator Pattern.我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧 ...
- 4. 泛型_EJ
第23条: 不要在新代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口,就是泛型类或接口.每种泛型都定义一组参数化的类型,每个泛型都定义一个原生态类型.例如List<E>相对应的 ...
- JAX-WS Web Service小试牛刀
1.使用Eclipse新建Java工程JavaDemo 2.新建包com.kira.ws 3.在包com.kira.ws新建类Hello,代码如下 package com.kira.ws; impor ...
- uni-app (1) 安装与运行。
安装: 直接到官网安装. 到插件市场下载一个模版. 新建项目的时候有提示链接: 找一个模版用于测试,或者在创建的时候选一个内置模版. 运行:第一次运行的时候有几个地方需要配置,这里因为只是用到了微信小 ...
- elementUI vue table 操作选项中弹出框确定dialog
1.html <el-table-column label="操作" width="150" fixed="right" align= ...
- CSS3动画属性:转换(transition)
W3C标准中对css3的transition这是样描述的:“css的transition允许css的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发, ...
- JS之函数实际参数转换成数组的方法[].slice.call(arguments)
实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通 ...
- JMeter java.net.URISyntaxException:Illegalcharacterinquery解决方案
java.net.URISyntaxException: Illegal character in query解决方案 by:授客 QQ:1033553122 测试环境 apache-jmeter ...
- ajax post 提交数据和文件
方式一:常用的方式是通过form.serialize()获取表单数据,但是,这样有个弊端,文件不能上传 $.ajax({ url:'/communication/u/', type:'POST', d ...
- day15(PYTHON)推导式{生成器,字典,列表,集合}
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # ...