[20220102]使用ashtop與dashtop指令碼的小問題.txt

lfree發表於2022-01-04

[20220102]使用ashtop與dashtop指令碼的小問題.txt

--//最近做最佳化工作,一直使用tpt的ashtop與dashtop指令碼探察資料庫問題,發現使用中一個小問題.
--//說明一下,使用ashtop查詢的是gv$active_session_history檢視,dashtop查詢的是dba_hist_active_sess_history檢視.
--//有時候兩者要經常交替使用.

--//有時候我需要查詢一個例項的情況,經常執行
@ashtop sql_id,inst_id 1=1 &day

--//切換為dashtop執行時出現問題

> @dashtop sql_id,inst_id 1=1 &day
        sql_id,inst_id
               *
ERROR at line 85:
ORA-00904: "INST_ID": invalid identifier

--//實際上問題在於dba_hist_active_sess_history檢視裡面沒有inst_id欄位,變成了instance_number欄位.也就是換成
--//dashtop執行的是:
@dashtop sql_id,instance_number 1=1 &day

--//兩者切換非常麻煩,修改一下dashtop.sql指令碼:

        (SELECT
             a.instance_number inst_id,
             a.*
             ...
        FROM dba_hist_active_sess_history a) a

--//這樣執行如下就沒有任何問題,切換執行起來很方便.
@dashtop sql_id,inst_id 1=1 &day

--//再比如我們應用執行的程式名一種是小寫另外一種是大寫的風格的型別,tpt指令碼定義一個欄位program2.只要修改如下就可以統一起
--//來.
CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(a.program, '.*\([PJ]\d+\)') THEN
   REGEXP_REPLACE(SUBSTR(a.program,INSTR(a.program,'(')), '\d', 'n')
ELSE
   '('||REGEXP_REPLACE(REGEXP_REPLACE(a.program, '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
END || ' ' program2

--//可以修改為
CASE WHEN a.session_type = 'BACKGROUND' OR REGEXP_LIKE(lower(a.program), '.*\([PJ]\d+\)') THEN
   REGEXP_REPLACE(SUBSTR(lower(a.program),INSTR(a.program,'(')), '\d', 'n')
ELSE
   '('||REGEXP_REPLACE(REGEXP_REPLACE(lower(a.program), '(.*)@(.*)(\(.*\))', '\1'), '\d', 'n')||')'
END || ' ' program2

--//如果你不想修改可以直接在查詢是增加欄位.
,lower(a.program) program1
,lower(a.module)  module1

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2850485/,如需轉載,請註明出處,否則將追究法律責任。

相關文章