Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1339649
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3800
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc

文章分类

全部博文(169)

文章存档

2024年(24)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2022-04-14 15:26:06


接PART1:数据库升级性能保障利器SQL Performance Analyzer_PART1

4.SPA 报告生成:生成对比性能报告

SPA采集到的SQLSET约500余万条SQL,需要生成buffer gets、cpu time、elapsed_time报告,此报告只列出top 300的记录,另外还需要生成error和unsupport报告。

生成报告之前需要做的准备工作如下:

1)  构造与升级目标库相同的测试环境。

2)  将10g生产库采集到的SQL负载(STS)传输到测试库中,包括pack、传输、unpack等过程。

3)  将数据库中的表尽可能有生产保持一致地传输到测试库中。

4)  统计信息处理:

要执行SPA分析升级前后性能,需要导入10g统计信息,对于统计信息的处理有3种:

1)  导入10g统计信息

2)  导入10g统计信息后,做修复处理,比如使用method_opt=>’for all columns size repeat’等,原10g未收集统计信息的表确认后排出收集。

3)  直接收集11g统计信息(不推荐使用,因为直方图不好确定)

一般1)和2)是常用的升级统计信息处理方式,如果10g统计信息有大量表存在问题,推荐使用2),所以在做SPA分析前,可以对统计信息完整性进行检查(未收集表、收集但是丢失了如列、索引、分区等统计信息、统计信息过旧等),从而确定最佳方案。


SPA报告生成流程如下:

1) 捕获生产环境SQL Tuning Sets,这个在第3节:SPA采集中已经说明。

2) 传输SQL Tuning Sets,10g上的STS通过诸如exp/imp,expdp/impdp等工具导入到11g待分析SPA环境中。

3) 执行10g分析:这步骤很快

4) 执行11g分析:这步骤根据SQL不同,耗时不同,库20w条左右SQL SET,大约耗时24小时。

5) 生成报告

6) 报告迭代:在执行3)到5)之前,由于STS数量很大,为了提高报告生成效率,需要进行SQL SET分割处理,之后生成报告,在分析报告的过程中,可能涉及到修改全局参数,这样,修改完参数后,还需要进行SPA分析,因此3)到5)的步骤是个迭代的过程。

7) 实施:整理分析结果,进行生成实施。


4.1 10g STS导入到11g

   10g STS以表形式导出,并导入到11g中,这需要在10g中对STS进行pack打包到一中转表中,然后导入到11g后,再unpack解包。

Pack过程:以a库为例,将多个sqlset导入到一个中转表中,可以将脚本用shell放后台执行(可以并行执行5个,多了会报ORA-01555错误)

--a库 sqlseta1_tab1tab20  

BEGIN

DBMS_SQLTUNE.create_stgtab_sqlset(table_name => 'STS_TAB_A_0922',

schema_name => 'SPA',

tablespace_name => 'SYSAUX');

END;

/

--pack

--a1

BEGIN

DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => 'sqlseta1_tab1',

sqlset_owner => 'SPA',

staging_table_name => 'STS_TAB_A_0922',

staging_schema_owner => 'SPA');

END;

/


。。。

BEGIN

DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => 'sqlseta1_tab20',

sqlset_owner => 'SPA',

staging_table_name => 'STS_TAB_A_0922',

staging_schema_owner => 'SPA');

END;

/

--a2

BEGIN

DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => 'sqlseta2_tab1',

sqlset_owner => 'SPA',

staging_table_name => 'STS_TAB_A_0922',

staging_schema_owner => 'SPA');

END;

/


。。。

BEGIN

DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => 'sqlseta2_tab8',

sqlset_owner => 'SPA',

staging_table_name => 'STS_TAB_A_0922',

staging_schema_owner => 'SPA');

END;

/

Pack完毕后进行剔除处理:

剔除一些诸如sqlplus,plsql dev等执行的SQL、以及按照FORCE_MATCHING_SIGNATURE剔除重复行、剔除insert into values等。

查看对应SQL类型的数据分布,后续按照数据分布情况分割STS

--command_type对应含义可以查询V$SQLCOMMAND

SQL> select count(*),command_type from SPA.STS_TAB_A_0922 group by command_type;

  COUNT(*) COMMAND_TYPE

---------- ------------

      2469            7  --DELETE

     27506           47  --PL/SQL EXECUTE

        11          170  --CALL METHOD

    169548            6  --UPDATE

   2204682            3  --SELECT

    253970            2  --INSERT

  执行剔除:

alter session enable parallel dml;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where MODULE='PL/SQL Developer';   

commit;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where MODULE='plsqldev.exe';

commit;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where MODULE like 'sqlplus%';

commit;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where MODULE like 'SQL*PLUS';

commit;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 a where rowid !=(select max(rowid)  from  SPA.STS_TAB_A_0922 b where a.FORCE_MATCHING_SIGNATURE=b.FORCE_MATCHING_SIGNATURE) and a.FORCE_MATCHING_SIGNATURE<>0;

commit;

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where upper(sql_text) like '%INSERT%INTO%VALUES%';

commit;


--删除command_type in (48,1,189) --SET TRANSACTION --CREATE TABLE  --ALTER TABLESPACE

delete/*+parallel(8)*/ from SPA.STS_TAB_A_0922 where command_type in (48,1,189);

commit;



10g导出STS

export NLS_LANG=American_America.zhs16gbk

expspa/spa tables=spa.STS_TAB_A_0922 file=/arch02/STS_TAB_A_0922.dmp log=STS_TAB_A_0922.log

导入STS到11g中:

imp spa/spa fromuser=spa touser=spa file=/oradata01/STS_TAB_A_0922.dmp feedback=100


4.2 11g 500w条记录的STS 分割

由于采集到的STS数量很大,需要分割STS,每个STS中存放20w条左右的SQL最佳,另外按照语句类型进行分割处理,这样SPA分析报告可以对指定的STS进行并行分析,确保1到2天内能够完成报告生成,提高报告生成效率。

1)分割STS

将STS均分,UPDATE+DELETE 1份,PL/SQL EXECUTE+CALL METHOD 份,INSERT单独1份,SELECT均分为10份,共13个STS。

--先查询总数量

SQL> select count(*) from STS_TAB_A_0922;

  COUNT(*)

----------

   2658186

--查询各类型SQL占的数量

select b.command_type,b.command_name,count(*)

from STS_TAB_A_0922 a,v$sqlcommand b

where a.command_type=b.command_type

group by b.command_type,b.command_name;

COMMAND_TYPE COMMAND_NAME                                                       COUNT(*)

------------ ---------------------------------------------------------------- ----------

           3 SELECT                                                              2204682

          47 PL/SQL EXECUTE                                                        27506

           2 INSERT                                                               253970

           7 DELETE                                                                 2469

           6 UPDATE                                                               169548

         170 CALL METHOD                                                              11

--建立索引,提高后续处理效率

CREATE INDEX IDX_STS_TAB_A_0922 ON STS_TAB_A_0922(SQL_ID) PARALLEL 16;

--SELECT语句对应STS进行拆分为10份,每份22w条左右

DECLARE

  L_CURR_TABLE_TIPS   NUMBER   :=0;

BEGIN

  --SELECT 0..9尾号 改为SQLSET_RUN

  FOR X IN (SELECT SQL_ID FROM STS_TAB_A_0922 where command_type =3 ORDER BY ELAPSED_TIME/EXECUTIONS) LOOP

    UPDATE STS_TAB_A_0922 SET NAME='SQLSET_RUN_'||L_CURR_TABLE_TIPS WHERE SQL_ID = X.SQL_ID;

    L_CURR_TABLE_TIPS := MOD(L_CURR_TABLE_TIPS + 1, 10);

  END LOOP;

END;

/


--UPDATE+DELETE SQLSET_RUN_10

UPDATE STS_TAB_A_0922 SET NAME='SQLSET_RUN_10' where command_type in (6,7);


--PL/SQL EXECUTE+CALL METHOD

UPDATE STS_TAB_A_0922 SET NAME='SQLSET_RUN_11' where command_type in (47,170);


--INSERT

UPDATE STS_TAB_A_0922 SET NAME='SQLSET_RUN_12' where command_type in (2);

COMMIT;

--查询SELECT对应数量

select name,count(*)

from STS_TAB_A_0922

where command_type=3

group by name;

NAME                             COUNT(*)

------------------------------ ----------

SQLSET_RUN_9                       220468

SQLSET_RUN_1                       220469

SQLSET_RUN_5                       220468

SQLSET_RUN_6                       220468

SQLSET_RUN_7                       220468

SQLSET_RUN_3                       220468

SQLSET_RUN_2                       220468

SQLSET_RUN_0                       220469

SQLSET_RUN_8                       220468

SQLSET_RUN_4                       220468



2)生成批量创建和删除并行SQL Set Table的语句

SPA用户执行,开多个窗口,每个要10分钟

--共13SQLSET要处理

set line 9999 pagesize 9999

select 'create table SQLSET_TAB_RUN_'||(ROWNUM-1)|| '

        NESTED TABLE "BIND_LIST" STORE AS "SQLSET_TAB_RUN_B_'||(ROWNUM-1)||'"

        NESTED TABLE "PLAN" STORE AS "SQLSET_TAB_RUN_P_'||(ROWNUM-1) || '"

        as select * from STS_TAB_A_0922 where name=''SQLSET_RUN_'||(ROWNUM-1)||''';' x

  FROM dba_objects where rownum <= 13;


3)检查数量

select 'SELECT ''SQLSET_TAB_RUN_'||(level-1)||''' name,count(*)

FROM SQLSET_TAB_RUN_'||(level-1)||' UNION ALL'

from dual

connect by level<=13;


NAME                COUNT(*)

----------------- ----------

SQLSET_TAB_RUN_0      220469

SQLSET_TAB_RUN_1      220469

SQLSET_TAB_RUN_2      220468

SQLSET_TAB_RUN_3      220468

SQLSET_TAB_RUN_4      220468

SQLSET_TAB_RUN_5      220468

SQLSET_TAB_RUN_6      220468

SQLSET_TAB_RUN_7      220468

SQLSET_TAB_RUN_8      220468

SQLSET_TAB_RUN_9      220468

SQLSET_TAB_RUN_10     172017

SQLSET_TAB_RUN_11      27517

SQLSET_TAB_RUN_12     253970


13 rows selected.


4.unpack sqlset

可以并行执行5个,多了会报ORA-01555错误。可以写成SHELL脚本放后台执行。

DECLARE

X NUMBER :=0;

BEGIN

    DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (

                 SQLSET_NAME          => 'SQLSET_RUN_'||X,

                 SQLSET_OWNER         => 'SPA',

                 REPLACE              => TRUE,

                 STAGING_TABLE_NAME   => 'SQLSET_TAB_RUN_'||X,

                 STAGING_SCHEMA_OWNER => 'SPA');

END;

/

。。。


DECLARE

X NUMBER :=12;

BEGIN

    DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (

                 SQLSET_NAME          => 'SQLSET_RUN_'||X,

                 SQLSET_OWNER         => 'SPA',

                 REPLACE              => TRUE,

                 STAGING_TABLE_NAME   => 'SQLSET_TAB_RUN_'||X,

                 STAGING_SCHEMA_OWNER => 'SPA');

END;

/


4.3 SPA分析需要的统计信息导入

测试环境中,准确的统计信息是运行SPA测试的基础。先确定统计信息方案,等确定方案后,导入10g统计信息到11g,导入后可能还需要做一些处理,比如更新统计信息等。实际上,在SPA分析过程中,因为统计信息问题导致2SPA分析迭代,第1次:直接导入10g统计信息,由于发现大量表统计信息有问题,缺失列信息,统计信息过旧等。后面确认采用导入10g统计信息后重新收集:

1) 生产库未收集统计信息的表,除非出现大的性能问题,确认后收集。

2) 生产库收集了统计信息的表,如果统计信息不完整,比如列或索引等缺失,则收集。采用method_opt => 'FOR ALL COLUMNS SIZE REPEAT',可以保证原先没有直方图的采用for all columns size 1,有直方图的更新直方图,estimate_percent默认。


统计信息处理流程如下:



将生产中需要的业务SCHEMA对象统计信息导出,然后传输到测试环境中,注意传到测试环境中,首先需要删除原有的统计信息,否则可能出现不一致的问题。流程和脚本如下:

1) 10g生产环境导出统计信息

--ogg.ogg_userlist存放需要导出的业务用户名,用来拼导出脚本

select 'exec DBMS_STATS.EXPORT_SCHEMA_STATS(ownname=>'''||upper(username)||''', stattab=>''STAT_SNC_10G_20140916'',statown=>''SPA'', statid=>'''||upper(username)||''');' from ogg.ogg_userlist;

--a库 exportstat.sh

echo start `date`

sqlplus / as sysdba <

exec DBMS_STATS.EXPORT_SCHEMA_STATS(ownname=>'AAAA', stattab=>'STAT_SNC_10G_20140916',statown=>'SPA', statid=>'AAAA');

…省略

exec DBMS_STATS.EXPORT_SCHEMA_STATS(ownname=>'TEST', stattab=>'STAT_SNC_10G_20140916',statown=>'SPA', statid=>'TEST');

exit;

EOF

echo end `date`

--后台执行

nohup ./exportstat.sh > exportstat.sh.log 2>&1 &



2) 删除11g测试环境统计信息

select 'exec DBMS_STATS.DELETE_SCHEMA_STATS(ownname=>'''||upper(username)||''', force=>true, no_invalidate=>false);' from ogg.ogg_userlist;


exec DBMS_STATS.DELETE_SCHEMA_STATS(ownname=>'AAAA', force=>true, no_invalidate=>false);

…省略

exec DBMS_STATS.DELETE_SCHEMA_STATS(ownname=>'TEST', force=>true, no_invalidate=>false);


3) 导入10g统计信息到11g测试环境中

-- 升级10g统计信息为11g,a,b库都做,表结构不同

exec DBMS_STATS.UPGRADE_STAT_TABLE(ownname=>'SPA', stattab=>'STAT_SNC_10G_20140916');



--导入,可编写shell脚本后台执行

--a库

--select 'exec DBMS_STATS.IMPORT_SCHEMA_STATS(ownname=>'''||upper(username)||''', stattab=>''STAT_SNC_10G_20140916'',statown=>''SPA'', statid=>'''||upper(username)||''', force=>true ,no_invalidate=>false);' from ogg.ogg_userlist;


exec DBMS_STATS.IMPORT_SCHEMA_STATS(ownname=>'AAAA', stattab=>'STAT_SNC_10G_20140916',statown=>'SPA', statid=>'AAAA', force=>true ,no_invalidate=>false);

…省略

exec DBMS_STATS.IMPORT_SCHEMA_STATS(ownname=>'TEST', stattab=>'STAT_SNC_10G_20140916',statown=>'SPA', statid=>'TEST', force=>true ,no_invalidate=>false);


在最终升级的统计信息方案是导入10g统计信息到11g后,对10g未收集的不收集,收集的采用for all columns size repeat更新,详细参考“4.最终升级统计信息方案”。


4.4创建并行分析任务生成报告

通过对STS进行拆分,可以实现SPA并行分析,SPA分析主要有:SPA任务创建、生成10g Trail,生成11g Trail,生成对比分析报告。

1) 创建并行SPA分析任务

此步骤很快,小于10s钟。

conn spa/spa

DECLARE

  L_SPA_TASK_NAME  VARCHAR2(64);

BEGIN

  FOR X IN 0..12 LOOP

    L_SPA_TASK_NAME := DBMS_SQLPA.CREATE_ANALYSIS_TASK(

                             TASK_NAME    => 'SPA_TASK_RUN_'||X,

                             DESCRIPTION  => 'SPA Analysis task at : '||TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'),

                             SQLSET_NAME  => 'SQLSET_RUN_'||X,

                             SQLSET_OWNER => 'SPA');

    DBMS_OUTPUT.PUT_LINE('SPA Task Created as : '||L_SPA_TASK_NAME);

  END LOOP;

END;

/

--查询任务是否创建

select owner,task_name from DBA_ADVISOR_TASKS where task_name like 'SPA_TASK_RUN_%';


2) 生成10g Trail


由于10g SQL执行信息已经采集到,所以此过程很快,小于10s,使用shell并行执行。主要参数用EXECUTION_TYPE指定为CONVERT SQLSET

i=0

while [ "$i" -le 12 ]

do

cat > ./exec_SPA_RUN_$i.sh <

sqlplus spa/spa <

EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( TASK_NAME => 'SPA_TASK_RUN_'||$i,EXECUTION_NAME => 'EXEC_10G_RUN_'||$i,EXECUTION_TYPE => 'CONVERT SQLSET',EXECUTION_DESC => 'Convert 10g SQLSET for SPA Task at : '||TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));

exit

EOF

EOFSCRIPT

chmod u+x exec_SPA_RUN_$i.sh

nohup ./exec_SPA_RUN_$i.sh > exec_SPA_RUN_$i.log 2>&1 &

i=$((i+1))

done


--查询执行情况以及是否有错误

set line 300 pagesize 9999

col STATUS_MESSAGE for a50;

col ERROR_MESSAGE for a50;

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

select TASK_ID,TASK_NAME,EXECUTION_NAME,EXECUTION_START,EXECUTION_END,STATUS_MESSAGE,ERROR_MESSAGE from DBA_ADVISOR_EXECUTIONS where task_name like 'SPA_TASK_RUN_%';

select MESSAGE,COUNT(*) FROM DBA_ADVISOR_FINDINGS WHERE TYPE='ERROR' GROUP BY MESSAGE ORDER BY 2;


1) 生成11g Trail

并行测试生成11g的执行信息,生成shell脚本,后台执行。这个过程最为关键的,也是最慢的过程,ORACLE会实际执行STS中对应SQL,有可能有的SQL执行计划改变,会执行的很慢,从而影响整理过程。最容易出问题的步骤就在这个过程中,因此,需要在执行过程中进行监控和分析、甚至需要迭代重跑并行分析任务。主要参数用EXECUTION_TYPE指定为TEST EXECUTE


i=0

while [ "$i" -le 12 ]

do

cat > ./exec_SPA_RUN_$i.sh <

sqlplus spa/spa <

EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK('SPA_TASK_RUN_$i', 'TEST EXECUTE', 'EXEC_11G_RUN_$i', NULL,

'Execute SQL in 11g for SPA Task at : '||TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));

exit

EOF

EOFSCRIPT

chmod u+x exec_SPA_RUN_$i.sh

nohup ./exec_SPA_RUN_$i.sh > exec_SPA_RUN_$i.log 2>&1 &

i=$((i+1))

done

1) 检查SPA分析任务进度和状态

由于第3步:生成11g Trail是非常耗时(库如果不进行STS拆分,需耗时13天左右)也是容易出问题的步骤,因此,需要在工作日,隔一小时查看下进度,并查看是否有报错。

set line 300 pagesize 999

col task_name for a20

col fin_ratio for a5

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SELECT SID, TASK_ID,(select distinct task_name from DBA_ADVISOR_EXECUTIONS b where a.task_id=b.task_id) task_name,SOFAR, TOTALWORK, ROUND(SOFAR/TOTALWORK,2)*100||'%' fin_ratio,

ELAPSED_SECONDS,LAST_UPDATE_TIME,START_TIME, START_TIME + (SYSDATE - START_TIME)/SOFAR * TOTALWORK EST_END_TIME

  FROM V$ADVISOR_PROGRESS a

 WHERE  TASK_ID IN (SELECT TASK_ID FROM  DBA_ADVISOR_EXECUTIONS where task_name like 'SPA_TASK%')

  AND SOFAR <> TOTALWORK

   AND SOFAR <> 0

ORDER BY 2;


----日志查询,查看出错信息

set line 300 pagesize 9999

col status_message for a10

col error_message for a50

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

select task_name,execution_start,execution_end,status,status_message,error_message from DBA_ADVISOR_LOG where TASK_NAME LIKE 'SPA%';


select TASK_ID,TASK_NAME,EXECUTION_NAME,EXECUTION_START,EXECUTION_END,STATUS_MESSAGE,ERROR_MESSAGE from DBA_ADVISOR_EXECUTIONS where task_name like 'SPA_TASK_RUN%' order by EXECUTION_START desc;


2) 生成SPA分析报告

通过对比10g11g SQL执行统计信息:buffer getscpu timeelapsed timeplan_hash_value等来获得执行计划是否改变、SQL性能是否下降报表。


并行执行分析过程并产生报告(Shell环境中执行,最好建立一个新的目录spareport,大约1小时。


cd /home/oracle/spa

mkdir spareport


脚本如下,放入后台执行

i=0

while [ "$i" -le 12 ]

do

cat > ./get_RPT_$i.sh <

sqlplus spa/spa <

-------------elapsed_time

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name => 'SPA_TASK_RUN_$i',

execution_type => 'COMPARE PERFORMANCE',

execution_name => 'Compare_elapsed_time',

execution_params => dbms_advisor.arglist('execution_name1', 'EXEC_10G_RUN_$i', 'execution_name2', 'EXEC_11G_RUN_$i', 'comparison_metric', 'elapsed_time') );

end;

/

-------------cpu_time

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name => 'SPA_TASK_RUN_$i',

execution_type => 'COMPARE PERFORMANCE',

execution_name => 'Compare_CPU_time',

execution_params => dbms_advisor.arglist('execution_name1', 'EXEC_10G_RUN_$i', 'execution_name2', 'EXEC_11G_RUN_$i', 'comparison_metric', 'CPU_TIME') );

end;

/

-------------buffer_gets

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name => 'SPA_TASK_RUN_$i',

execution_type => 'COMPARE PERFORMANCE',

execution_name => 'Compare_BUFFER_GETS_time',

execution_params => dbms_advisor.arglist('execution_name1', 'EXEC_10G_RUN_$i', 'execution_name2', 'EXEC_11G_RUN_$i', 'comparison_metric', 'BUFFER_GETS') );

end;

/

ALTER SESSION SET EVENTS='31156 TRACE NAME CONTEXT FOREVER, LEVEL 0X400';

-------------report

SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED

spool spa_report_elapsed_time_$i.html

SELECT dbms_sqlpa.report_analysis_task('SPA_TASK_RUN_$i', 'HTML', 'ALL','ALL', top_sql=>300,execution_name=>'Compare_elapsed_time') FROM dual;

spool off;

spool spa_report_CPU_time_$i.html

SELECT dbms_sqlpa.report_analysis_task('SPA_TASK_RUN_$i', 'HTML', 'ALL','ALL', top_sql=>300,execution_name=>'Compare_CPU_time') FROM dual;

spool off;

spool spa_report_buffer_$i.html

SELECT dbms_sqlpa.report_analysis_task('SPA_TASK_RUN_$i','HTML','ALL','ALL',top_sql=>300,execution_name=>'Compare_BUFFER_GETS_time') FROM dual;

spool off;

spool spa_report_errors_$i.html

SELECT dbms_sqlpa.report_analysis_task('SPA_TASK_RUN_$i', 'HTML', 'errors','summary') FROM dual;

spool off;

spool spa_report_unsupport_$i.html

SELECT dbms_sqlpa.report_analysis_task('SPA_TASK_RUN_$i', 'HTML', 'unsupported','all') FROM dual;

spool off;

exit

EOF

EOFSCRIPT

chmod u+x get_RPT_$i.sh

#nohup ./get_RPT_$i.sh >get_RPT_$i.log 2>&1 &

i=$((i+1))

done



4.5 SPA分析的迭代过程

SPA分析经过多次迭代,每迭代一次,则4.4的步骤就要重新做一遍,只需要修改对应的TASK_NAME即可,如果找到正确的方法,可以减少迭代次数。每次迭代都是由于经过SPA分析发现问题,不得不修改如影响全局的优化器参数、打开或关闭fix control开关、收集大量表的统计信息等,主要由于影响较大,所以需要重跑SPA分析。

第一次迭代:设置参数_optimizer_squ_bottomup=true和_optimizer_cost_based_transformation=LINEAR。

第二次迭代:将"_fix_control"增加'9380298:ON',加上原有的开关,执行语句:

alter system  set "_fix_control"='9380298:ON','8560951:ON','8893626:OFF','9344709:OFF','9195582:OFF';

第三次迭代:导入10g统计信息到11g库中后,对10g原先不收集的表还是不收集,已收集的表通过method_opt=>’for all columns size repeat’更新。

其它迭代:由于执行过程中报ORA-01555错误。见4.6.SPA执行分析过程注意点。



4.6 SPA执行分析过程注意点

SPA执行过程中,某些SQL可能因为执行计划改变或者数据量变化,导致执行超时或报错(ORA-01555等),这时,SPA分析可能终止,需要找出对应SQL,从STS中清除出去,单独分析或设置超时。如下:

查询超时SQL

 select b.sql_id

  from DBA_ADVISOR_FINDINGS a,dba_advisor_sqlstats b

   where a.task_id=b.task_id and a.object_id=b.object_id

   and a.TYPE='ERROR'

  and a.message like '%The current operation was interrupted because it timed out%';


--导致ora-01555错误的sql,暂且删除

EXEC DBMS_SQLTUNE.DELETE_SQLSET('SQLSET_RUN_3','sql_id=''5r5jth1k2prdr''','SPA');


--修改undo

alter tablespace undo add datafile '....' size 8192M AUTOEXTEND OFF;

alter system set undo_retention=10000;


报ORA-01555错误,除了undo设置以外,还可能是执行时间超长,可以对执行TASK设置超时,当某个SQL超出XX秒后,则自动结束,这个步骤,需要在生成11g Trial之前做,如下:

--设置超时时间 很重要,有的特别长的,超时跳过,防止ORA-01555

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_0',parameter=>'LOCAL_TIME_LIMIT',value=>'2000');

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_1',parameter=>'LOCAL_TIME_LIMIT',value=>'3000');

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_3',parameter=>'LOCAL_TIME_LIMIT',value=>'3000');

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_4',parameter=>'LOCAL_TIME_LIMIT',value=>'3000');

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_6',parameter=>'LOCAL_TIME_LIMIT',value=>'3000');

exec DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(task_name=>'SPA_TASK_RUN_7',parameter=>'LOCAL_TIME_LIMIT',value=>'3000');


下一篇:数据库升级性能保障利器SQL Performance Analyzer_PART3
阅读(1317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~