Gblog

おもにTips

リアルタイムSQL監視レポートとDBMS_XPLAN.DISPLAY_CURSOR

リアルタイムSQL監視レポートは非常に便利。Predicate information もみたいので、DBMS_XPLAN.DISPLAY_CURSOR と使うことが多いです。

 

リアルタイムSQL監視レポート

set linesize 1000 pages 1000
set long 1000000 longchunksize 1000000
select dbms_sqltune.report_sql_monitor(sql_id=>'※SQL_ID', type=>'TEXT') from dual;

 

dbms_xplan.display_cursor

dbms_xplan.display_cursor
set linesize 1000 pages 1000
select * from dbms_xplan.display_cursor('※SQL_ID', NULL, 'ADVANCED ALLSTATS LAST');

 

 

で、簡単なサンプル。

var b1 number
exec :b1 := 100;
select /*+ monitor */ * from v$parameter where num < :b1;
select sql_id from v$sql where sql_text like 'select /*+ monitor %';

set linesize 1000 pages 1000
set long 1000000 longchunksize 1000000
select dbms_sqltune.report_sql_monitor(sql_id=>'181qakywu644s', type=>'TEXT') from dual;

dbms_xplan.display_cursor
set linesize 1000 pages 1000
select * from dbms_xplan.display_cursor('181qakywu644s', NULL, 'ADVANCED ALLSTATS LAST');

表レベルのサプリメンタルロギングは有効なのか?

DBA_LOG_GROUPS で確認できる。

 

SQL> select LOG_GROUP_NAME, TABLE_NAME, LOG_GROUP_TYPE from DBA_LOG_GROUPS where OWNER='G';

LOG_GROUP_NAME      TABLE_NAME        LOG_GROUP_TYPE
------------------- ----------------- ----------------------------
GGS_XXXXX           TEST               USER LOG GROUP
SYS_C0000001        TEST               PRIMARY KEY LOGGING
SYS_C0000002        TEST               UNIQUE KEY LOGGING
SYS_C0000003        TEST               FOREIGN KEY LOGGING

 

DBA_LOG_GROUP_COLUMNS もある。

alert log の timestamp を各行の先頭に付与してファイル出力する

python です。

python はド素人です。

 

import os
import re
import sys

args = sys.argv

# ファイル名を引数に指定
alert_log = args[1]

# timestamp の初期値
timstr = '------------------------'

# エンコーディング(in/out 共通)
encode = "shift-jis"

# timestamp 文字列
stmstmp = ("2019-","2020-")
etmstmp = (" 2019"," 2020")

def alert_time(f):

    ifile = f 
    ofile = f + ".out"

    with open(ofile,"w",encoding=encode) as o:

        with open(ifile,"r",encoding=encode) as i:

            for line in i:
                line = line.strip()
                if line[0:5] in stmstmp or line[-5:] in etmstmp:
                    timstr = line
                elif  len(line) != 0:
                    o.write(timstr + ' // ' + line + "\n")


if __name__=="__main__":

    if len(args) != 2:
        print("Usage : > python alert_timemod.py ")
    else:
        alert_time(alert_log)

 

自己責任でお願いできればと思います。