oracle spa

oracle spa屬於real application test的內容,用來對比sql先後性能變化,好比我要比較一條sql先後的的性能變化:
--單條sql流程html

alter session set optimizer_features_enable='10.2.0.4';
variable g_task varchar2(100);
exec :g_task:= dbms_sqlpa.create_analysis_task(task_name=>'TASK2',sql_text=>'select count(*) from employees where employee_id>10') 
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>'test execute',execution_name=>'before_change');
alter table employees drop primary key drop index;
alter session set optimizer_features_enable='11.2.0.4';
--EXEC DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER( :g_task,'comparison_metric', 'buffer_gets');
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>'test execute',execution_name=>'after change'); 
exec  dbms_sqlpa.execute_analysis_task(task_name=>:g_task,execution_type=>'compare performance',execution_name=>'compar'); 
spool d:\spa_report_elapsed_time.html
SELECT dbms_sqlpa.report_analysis_task(:g_task, 'HTML', 'ALL','ALL') FROM dual;
spool off;
exec  DBMS_SQLPA.DROP_ANALYSIS_TASK('TASK2');
begin
DBMS_SQLPA.DROP_ANALYSIS_TASK('TASK2');
end;

oracle spa
固然一條SQ鬧這麼大動靜是不值得的,用dba_hist視圖就能夠對比出來了,不用這麼煩神;一個schema下的全部sql這個就比較勞神了,用spa能夠很好的解決這個問題,流程以下:
**1.在生產上捕獲工做負載sql

2.將SQL工做負載傳輸到一個測試系統服務器

3.構建「更改前」性能數據session

4.進行SQL重放,生成性能數據oracle

5.對比,生成報告app

具體實施步驟:
源端:oracle 10.2.0.1 ,hr用戶,權限:grant advisor,administer sql tuning set to hr;
1 找到awr對應的snapshot;ide

begin 
  dbms_workload_repository.create_snapshot(); 
end;
select * from dba_hist_snapshot where begin_interval_time>sysdate-1/24

2 創建sqlset ,採集sql性能數據
--建立sqlset性能

begin
    dbms_sqltune.create_sqlset('sql_1') ;
    end;
declare cur sys_refcursor;
            begin
            open cur for
            SELECT VALUE(P) FROM
            TABLE(DBMS_SQLTUNE.select_workload_repository(49,50,q'[ parsing_schema_name in ('HR') ]')) p;
            dbms_sqltune.load_sqlset(sqlset_name => 'sql_1',populate_cursor => cur);
            close cur;
            end;
            /

--查看sqlset集 測試

select * from table(dbms_sqltune.select_sqlset('sql_1')) where buffer_gets>0;
--建立sqlset表spa

begin
   dbms_sqltune.create_stgtab_sqlset(table_name => 'SPA_2',schema_name => 'HR');
   end;

--執行pack,將數據打包到表

begin
    DBMS_SQLTUNE.pack_stgtab_sqlset(sqlset_name => 'upg_sql',
    SQLSET_OWNER=>'HR',
    staging_table_name => 'SPA_2',
   staging_schema_owner => 'HR');
end;

--刪除sqlset

exec  dbms_sqltune.drop_sqlset('sql_1') ;

select  sql_id,sql_text,buffer_gets from spa_2;

expdp hr/hr directory=exp dumpfile=spa.dmp logfile=spa.log tables=SPA_2

oracle spa

傳輸到11g的服務器,目標端:oracle 11.2.0.4
impdp以後解壓:

begin
 DBMS_SQLTUNE.UNPACK_STGTAB_SQLSET(sqlset_name         => 'sql_1',
                                       sqlset_owner        => 'HR', 
                                       replace             => TRUE, 
                                       staging_table_name  => 'SPA_2');
   end;

創建分析任務

VAR aname varchar2(30);
EXEC :aname := DBMS_SQLPA.CREATE_ANALYSIS_TASK(task_name => 'compares',sqlset_name =>'sql_1');

--執行源端10g分析
begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => 'compares',
          execution_type => 'convert sqlset',
          execution_name => 'first trial');
          end;
--執行目標端11分析         
begin

  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => 'compares',
          execution_type => 'test execute',
          execution_name => 'second trial'
          );

end;

--生成比較任務     
begin
  DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(task_name => 'compares',
          execution_type => 'compare',
          execution_name => 'compare_1'
          );   
 end;
 --生成報告  
 spool reports.html
 SELECT DBMS_SQLPA.REPORT_ANALYSIS_TASK('compares', 'html', 'TYPICAL', 'ALL') from dual;

刪除任務

begin
  DBMS_SQLPA.DROP_ANALYSIS_TASK('compares');
  end;

相關包說明參考:Oracle® Database PL/SQL Packages and Types Reference 11g Release 2 (11.2)--》dbms_spa/dbms_sqltune
1 相關錯誤

ERROR at line 1:
ORA-13757: "SQL Tuning Set" "sql_1" owned by user "HR" is active.
說明sql_1正在被使用,找到被引用的分析任務

select description, created, owner
from DBA_SQLSET_REFERENCES
where sqlset_name ='sql_1';
DESCRIPTION                                 CREATED   OWNER
--------------------------------------------------------------------------------------------- --------- ------------------------------
created by: SQL Performance Analyzer - task: compare_1                20-JUL-18 HR
select owner,description, created,last_modified
 from DBA_ADVISOR_TASKS
 where task_name = 'compare_1';

刪除便可:

execute dbms_sqltune.drop_tuning_task('compare_1');
begin
 dbms_sqltune.drop_sqlset('sql_1');
end;
相關文章
相關標籤/搜索