记录一则完整的SPA(10g->11g)测试过程
生产端:Windows 2008 + Oracle 10.2.0.5
1.SPA测试流程为了尽可能的减小对正式生产库的性能影响,本次SPA测试只是从AWR资料库中的SQL数据转化而来的SQL Tuning Set进行整体的SQL性能测试。
2.SPA操作流程2.1 本文使用的命名规划 类型 规划 SQLSET ORCL_SQLSET_201806 Analysis Task SPA_TASK_201806 STGTAB ORCL_STSTAB_201806 Dmpfile ORCL_STSTAB_201806.dmp 2.2 生产端:环境准备 conn / as sysdba CREATE USER SPA IDENTIFIED BY SPA DEFAULT TABLESPACE SYSAUX; GRANT DBA TO SPA; GRANT ADVISOR TO SPA; GRANT SELECT ANY DICTIONARY TO SPA; GRANT ADMINISTER SQL TUNING SET TO SPA; 2.3 生产端:采集数据 SET LINES 188 PAGES 1000 COL SNAP_TIME FOR A22 COL MIN_ID NEW_VALUE MINID COL MAX_ID NEW_VALUE MAXID SELECT MIN(SNAP_ID) MIN_ID,MAX(SNAP_ID) MAX_ID FROM DBA_HIST_SNAPSHOT WHERE END_INTERVAL_TIME > trunc(sysdate)-10 ORDER BY 1; 2). 创建SQL Set --连接用户 conn SPA/SPA --如果之前有这个SQLSET的名字,可以这样删除 EXEC DBMS_SQLTUNE.DROP_SQLSET (SQLSET_NAME => ‘ORCL_SQLSET_201806‘,SQLSET_OWNER => ‘SPA‘); --新建SQLSET:ORCL_SQLSET_201806 EXEC DBMS_SQLTUNE.CREATE_SQLSET ( - SQLSET_NAME => ‘ORCL_SQLSET_201806‘,- DESCRIPTION => ‘SQL Set Create at : ‘||TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘),- SQLSET_OWNER => ‘SPA‘); 3). 转化AWR数据中的SQL数据,将其中的SQL载入到SQL Set中 DECLARE SQLSET_CUR DBMS_SQLTUNE.SQLSET_CURSOR; BEGIN OPEN SQLSET_CUR FOR SELECT VALUE(P) FROM TABLE( DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY( 16,24,‘PARSING_SCHEMA_NAME NOT IN (‘‘SYS‘‘,‘‘SYSTEM‘‘)‘,NULL,1,‘ALL‘)) P; DBMS_SQLTUNE.LOAD_SQLSET( SQLSET_NAME => ‘ORCL_SQLSET_201806‘,SQLSET_OWNER => ‘SPA‘,POPULATE_CURSOR => SQLSET_CUR,LOAD_OPTION => ‘MERGE‘,UPDATE_OPTION => ‘ACCUMULATE‘); CLOSE SQLSET_CUR; END; / 4). 打包SQL Set DROP TABLE SPA.JYZHAO_SQLSETTAB_20180106; EXEC DBMS_SQLTUNE.CREATE_STGTAB_SQLSET (‘ORCL_STSTAB_201806‘,‘SPA‘,‘SYSAUX‘); EXEC DBMS_SQLTUNE.PACK_STGTAB_SQLSET ( - SQLSET_NAME => ‘ORCL_SQLSET_201806‘,- SQLSET_OWNER => ‘SPA‘,- STAGING_TABLE_NAME => ‘ORCL_STSTAB_201806‘,- STAGING_SCHEMA_OWNER => ‘SPA‘); 2.4 生产端:导出数据 cat > ./export_sqlset_201806.par <<EOF USERID=‘SPA/SPA‘ FILE=ORCL_STSTAB_201806.dmp LOG=exp_spa_sqlset_201806.log TABLES=ORCL_STSTAB_201806 DIRECT=N BUFFER=10240000 STATISTICS=NONE EOF 注意:这里DIRECT=Y参数在遇到问题后尝试改为了DIRECT=N,默认也是N。 set NLS_LANG=AMERICAN_AMERICA.US7ASCII exp PARFILE=export_sqlset_201806.par 注意:NLS_LANG变量是Oracle的变量,设置字符集和数据库字符集一致,避免发生错误转换。 2). 将导出后的Dump文件传输到测试服务器 2.5 测试端:环境准备 conn / as sysdba CREATE USER SPA IDENTIFIED BY SPA DEFAULT TABLESPACE SYSAUX; GRANT DBA TO SPA; GRANT ADVISOR TO SPA; GRANT SELECT ANY DICTIONARY TO SPA; GRANT ADMINISTER SQL TUNING SET TO SPA; 2.6 测试端:测试准备 cat > ./import_sqlset_201806.par <<EOF USERID=‘SPA/SPA‘ FILE=ORCL_STSTAB_201806.dmp LOG=imp_spa_sqlset_201806.log FULL=Y EOF export NLS_LANG=AMERICAN_AMERICA.US7ASCII imp PARFILE=import_sqlset_201806.par 2). 解包(unpack)SQL Set conn SPA/SPA EXEC DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET (- SQLSET_NAME => ‘ORCL_SQLSET_201806‘,- REPLACE => TRUE,- STAGING_SCHEMA_OWNER => ‘SPA‘); 3). 创建SPA分析任务 VARIABLE SPA_TASK VARCHAR2(64); EXEC :SPA_TASK := DBMS_SQLPA.CREATE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- DESCRIPTION => ‘SPA Analysis task at : ‘||TO_CHAR(SYSDATE,- SQLSET_NAME => ‘ORCL_SQLSET_201806‘,- SQLSET_OWNER => ‘SPA‘); 2.7 测试端:前期性能 EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- EXECUTION_NAME => ‘EXEC_10G_201806‘,- EXECUTION_TYPE => ‘CONVERT SQLSET‘,- EXECUTION_DESC => ‘Convert 10g SQLSET for SPA Task at : ‘||TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘)); 2.8 测试端:后期性能 vi spa2.sh echo "WARNING: SPA2 Start @`date`" sqlplus SPA/SPA << EOF! EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- EXECUTION_NAME => ‘EXEC_11G_201806‘,- EXECUTION_TYPE => ‘TEST EXECUTE‘,- EXECUTION_DESC => ‘Execute SQL in 11g for SPA Task at : ‘||TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘)); exit EOF! echo "WARNING:SPA2 OK @`date`" nohup sh spa2.sh & 2.9 测试端:性能对比 1). 对比两次Trail中的SQL执行时间 conn SPA/SPA EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- EXECUTION_NAME => ‘COMPARE_ET_201806‘,- EXECUTION_TYPE => ‘COMPARE PERFORMANCE‘,- EXECUTION_PARAMS => DBMS_ADVISOR.ARGLIST( - ‘COMPARISON_METRIC‘,‘ELAPSED_TIME‘,- ‘EXECUTE_FULLDML‘,‘TRUE‘,- ‘EXECUTION_NAME1‘,‘EXEC_10G_201806‘,- ‘EXECUTION_NAME2‘,‘EXEC_11G_201806‘),- EXECUTION_DESC => ‘Compare SQLs between 10g and 11g at :‘||TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS‘)); 2). 对比两次Trail中的SQL执行的CPU时间 EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- EXECUTION_NAME => ‘COMPARE_CT_201806‘,‘CPU_TIME‘,‘YYYY-MM-DD HH24:MI:SS‘)); 3). 对比两次Trail中的SQL执行的逻辑读 EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK( - TASK_NAME => ‘SPA_TASK_201806‘,- EXECUTION_NAME => ‘COMPARE_BG_201806‘,‘BUFFER_GETS‘,‘YYYY-MM-DD HH24:MI:SS‘)); 2.10 测试端:汇总报告 a) 获取执行时间全部报告 conn SPA/SPA ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL elapsed_all.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘HTML‘,‘ALL‘,1000,‘COMPARE_ET_201806‘)).GETCLOBVAL(0,0) FROM DUAL; spool off b) 获取执行时间下降报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL elapsed_regressed.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘REGRESSED‘,0) FROM DUAL; spool off c) 获取逻辑读全部报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL buffer_all.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘COMPARE_BG_201806‘)).GETCLOBVAL(0,0) FROM DUAL; spool off d) 获取逻辑读下降报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL buffer_regressed.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,0) FROM DUAL; spool off e) 获取错误报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL error.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘ERRORS‘,0) FROM DUAL; spool off f) 获取不支持报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL unsupported.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘UNSUPPORTED‘,0) FROM DUAL; spool off g) 获取执行计划变化报告 ALTER SESSION SET EVENTS=‘31156 TRACE NAME CONTEXT FOREVER,LEVEL 0X400‘; SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED SPOOL changed_plans.html SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK(‘SPA_TASK_201806‘,‘CHANGED_PLANS‘,0) FROM DUAL; spool off 3.SPA环境清理3.1 查看SQLSET conn SPA/SPA select owner,name,STATEMENT_COUNT from dba_sqlset; 3.2 查看分析任务 select owner,task_id,task_name,created,LAST_MODIFIED,STATUS from DBA_ADVISOR_TASKS where task_name like upper(‘%&task_name%‘) order by 2; SPA_TASK_201806 3.3 删除ANALYSIS_TASK exec dbms_sqlpa.DROP_ANALYSIS_TASK(‘SPA_TASK_201806‘); 3.4 删除sqlset exec dbms_sqltune.DROP_SQLSET(‘ORCL_SQLSET_201806‘); 如果删除时出现异常情况"ORA-13757",提示STS是活动的,可以尝试使用下面SQL修改后再进行删除。 delete from wri$_sqlset_references where sqlset_id in (select id from wri$_sqlset_definitions where name in (‘ORCL_SQLSET_201806‘,‘ORCL_SQLSET_201806‘)); commit; 3.5 删除用户 drop user spa cascade; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |