摘要: 作者介紹 蔣健,雲趣網路科技聯合創始人,11g ocm,多年oracle設計、管理及實施經驗,精通資料庫優化,oracle cbo及並行原理,曾為多個行業的客戶的 oracle 系統實施小型機到 x86跨平台遷移和資料庫優化服務。
作者介紹
蔣健,雲趣網路科技聯合創始人,11g ocm,多年oracle設計、管理及實施經驗,精通資料庫優化,oracle cbo及並行原理,曾為多個行業的客戶的 oracle 系統實施小型機到 x86跨平台遷移和資料庫優化服務。雲趣鷹眼監控核心設計和開發者,資深python web開發者。
一、概述
通常,dba 確定通過 oracle 的頂級活動會話圖確定 top sql,有了 sql 的執行會話資訊和 sql 文字,可以和開發人員確定 top sql 來自哪些應用模組的。有時候,oracle dba 需要自己確認 sql 的**,本文將演示如何使用 oracle 提供豐富的跟蹤功能,來確認遞迴 sql 的呼叫者**。
二、問題描述
通過頂級會話頁面,dba 發現乙個異常的 top sql,sql id 為c7452agj0s0t6,消耗了9%的資料庫時間。
通過 sql 詳情頁面,可以確定 sql c7452agj0s0t6 的使用者名稱和模組,但是沒有確定 sql c7452agj0s0t6 是哪個客戶機器造成的。
從 sql 的文字中,這是乙個針對系統檢視 v$active_session_history 的查詢。
select group_type, bucket_start, bucket_end, tm_group_type, tm_bucket_start,
tm_bucket_end, sum(tm_cpu_first_bucket_value) tm_cpu_first_bucket_value,
sum(tm_cpu_middle_buckets_value) tm_cpu_middle_buckets_value,
... 省略大量 sql 文字
from table(sys.gv$(cursor(
... 省略大量 sql 文字
select ash0.*
from v$active_session_history ash0
... 省略大量 sql 文字
通過 sql 的活動會話資訊,可以確定執行該 sql 的程序為後台 pz 程序,這些會話的 qc(query coordinator)不為空,也就是這是針對檢視 v$active_session_history 的並行查詢造成的。因為執行時間很短,並且執行此 sql 的會話為短連線,無法查詢到 qc 會話的**。
三、sql id 級別的跟蹤分析
為了確定 sql c7452agj0s0t6 的**,我們使用 oracle 11g 中的新功能,對單個 sql id 開啟10046事件跟蹤,命令如下:
alter system set events 'sql_trace [sql:c7452agj0s0t6] wait=true,bind=true,plan_stat=all_executions,level=12';
通過以下查詢確定 trace 檔案的產生目錄:
select value from v$diag_info where name='default trace file';
*** 2016-10-14 09:34:13.921
*** session id:(329.41269) 2016-10-14 09:34:13.921
*** client id:() 2016-10-14 09:34:13.921
*** service name:(prddb) 2016-10-14 09:34:13.921
*** action name:() 2016-10-14 09:34:13.921
... 省略大量文字
********************=
parsing in cursor #139987897061528 len=11079 dep=2 uid=87 oct=3 lid=87 tim=1476408854404253 hv=3792438054 ad='21b01ba960' sqlid='c7452agj0s0t6'
關閉 sql id 跟蹤的命令如下:
alter system set events 'sql_trace [sql:c7452agj0s0t6] off';
四、會話級別的跟蹤分析
create or replace trigger sys.set_trace
after logon on database
declare
begin
execute immediate 'alter session set statistics_level=all';
execute immediate 'alter session set max_dump_file_size=unlimited';
execute immediate 'alter session set events ''10046 trace name context forever, level 12''';
end set_trace;
/
接著,在跟蹤檔案目錄中找到最新生成的跟蹤檔案 prddb1_ora_10452.trc 包含 sql id c7452agj0s0t6。接著我們使用 orasrp 這個工具分析10046跟蹤檔案. orasrp 為 oracle session resource profiler,出自一位俄羅斯 dba 的強大的10046分析工具,**為:
orasrp prddb1_ora_10452.trc prddb1_ora_10452.html
orasrp相對於 oracle 自帶的 tkprof,功能更加強大,其中一大優勢是會生成會話的遞迴呼叫樹。遞迴呼叫樹(session call graph)部分如下圖,sql hash value=3792438054 為 sql c7452agj0s0t6,深度為2,頂級的 sql hash value = 2036392974。
頂級 sql 文字如下,原來 sql c7452agj0s0t6 是由 dbms_sqltune.report_sql_monitor 這個生成 sql monitor 報告的函式遞迴呼叫的。確定是前幾天新部署的監控 job,在後台定時抓取和儲存新生成的 sql monitor 報告,但是執行過於頻繁。解決的方法為降低後台 job 的執行頻率,對每次抓取 sql monitor 的執行時間提高限制。
select dbms_sqltune.report_sql_monitor(type=>:1, sql_id=>:2, sql_exec_id=>:3, report_level=>'all') monitor_report from dual;
確定問題**之後,刪除 logon 觸發器,避免過多的跟蹤檔案產生:
drop trigger sys.set_trace;
五、總結
本文演示了如果在 oracle 中分別使用 sql id 和會話級別的10046跟蹤,以確定遞迴 sql 的呼叫源頭來自 pl/sql 函式 dbms_sqltune.report_sql_monitor。現實工作中,使用類似的方法,可以對 pl/sql **效能,oracle 解析時間過長等疑難雜症進行分析。對於 dba 來說,使用 orasrp 對10046跟蹤檔案生成的遞迴呼叫樹,也是研究應用負載特徵的乙個好手段。
原文發布時間為:2016-11-28
遞迴SQL簡單學習
遞迴查詢解決樹形資料很管用 sql server引入公用表表示式 cte 可建立遞迴查詢 首先,檢視了一下msdn關於cte的介紹 了解到如下資訊 cte 的基本語法結構如下 with expression name column name n as cte query definition cte...
oracle中使用SQL遞迴語句
場景 常見的領導關係樹結構,知道某一節點id,要查出此節點的所有下級 直接下級和間接下級 此時需要使用sql遞迴語句。oracle中的遞迴語句 start with connect byprior 例子 pid id a b a c a e b b1 b b2 c c1 e e1 e e3 d d1...
Oracle 起步日記(22) SQL調優
索引 在db中,索引建立的目的就是為了避免對錶的掃瞄,以此減少大量的i o操作,從而提高系統的效能 建立索引的一些規律 表的主鍵和外來鍵必須要有索引 對經常與其他表進行連線的表的連線字段應該建立索引 經常出現在where子句中的字段應該建立索引 小字段應該建立索引 復合索引的建立需要經過仔細分析,盡...