在ArcSDE使用過程中,經常有使用者抱怨ArcSDE的性能慢,那麼除了常識性的ArcSDE知識來進行性能優化外,如果我們能夠深入資料庫,分析執行的每一個SQL語句,得到消耗時間最多的SQL語句,這樣的話我們就可以有針對性的來對性能提供一個很好的而且有針對性的方向。
對跟蹤Oracle trace檔案其實并不複雜,ArcGIS也提供了相應的GP工具,如果不喜歡敲指令的朋友可以參考一下:
http://blog.csdn.net/linghe301/article/details/6946562
也可以使用PL/SQL來跟蹤
但是,有時候去調試一般都沒有那麼多GUI用戶端來幫助我們,是以還是掌握一個指令行的跟蹤方法比較實用。
下面我們就介紹一下比較常用的在Session級别使用Oracle Trace方法來跟蹤。
1:首先我們需要使用oracle的SYS使用者來連接配接資料庫
2:設定參數
- 修改時間格式:alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
- 設定TIMED_STATISTICS為True,設定在會話級: alter session set timed_statistics=True;
- 設定SQL_TRACE,在會話級:alter session set sql_trace=true;
SQL_TRACE是Oracle的一個非常強大的工具。主要用來檢查資料庫的異常情況,通過跟蹤資料庫的活動,找到有問題的語句。打開SQL_TRACE就可以逐漸捕獲任何一個會話的資料庫活動,或者捕獲整個資料庫的活動,并将資料庫活動記錄成跟蹤檔案。每次使用完之後需要關閉跟蹤,否則會降低系統的性能。
TIMED_STATISTICS指定與時間相關的統計量是否被收集。
3:獲得session的SID和SERIAL#資訊
在使用ArcGIS的時候,有人用服務連接配接,有人用直連,有人用ArcMap,有人用ArcCatalog,也有人用其他ArcGIS開發的用戶端,那麼在測試時,建議大家如果是自己開發的的程式可以轉換成在Arcmap上進行測試,這樣就可以來分析到底是用戶端的問題還是資料庫的問題,我們預設的ArcMap、ArcCatalog是絕對高效和無誤的。
SQL> select SID,SERIAL#, USERNAME,MACHINE,PROGRAM,LOGON_TIME from v$session where username is not null;
SID SERIAL# USERNAME MACHINE PROGRAM LOGON_TIME
-------------------------------------------------------------------------------------------------------------------------------
1 68 15113 SYSTEM WORK\LISH plsqldev.exe 2013-3-6 10:38:39
2 73 6147 SDE WORK\LISH ArcMap.exe 2013-3-6 9:37:59
3 74 3645 SDE rhsde [email protected] (TNS V1-V3) 2013-2-26 17:00:00
4 136 2856 SYSTEM WORK\LISH plsqldev.exe 2013-3-6 10:38:49
5 137 27 SDE rhsde [email protected] (TNS V1-V3) 2013-3-6 11:04:29
6 195 3 SDE rhsde [email protected] (TNS V1-V3) 2013-2-16 7:54:59
7 rows selected
從上面可以獲得相關的SID和SERIAL#資訊
TIPs:上面我列出的資訊比較全,但是實質内容是根據使用者的連接配接session來獲得SID和SERIAL#的内容,但是使用者可以通過連接配接的用戶端(ArcMap直連、PLSQL、gsrvr服務連接配接),連接配接終端的機器名,連接配接時間來确定相關資訊。
4:開始跟蹤,輸入exec dbms_support.start_trace_in_session(&sid,&serial#,true,true)
TIPs:如果系統沒有安裝dbms_support包,可以執行$ORACLE_HOME/rdbms/admin/dbmssupp.sql進行安裝
5.然後到ArcMap或ArcCatalog中進行你想跟蹤的操作。
6.結束跟蹤exec dbms_support.stop_trace_in_session(&sid,&serial#);
TIPs:最好是一步步的短操作,比如隻測試加載資料,隻測試放大資料,隻測試編輯資料。
怎麼得到trace檔案,使用者需要在伺服器端的目錄裡面獲得,我們可以直接進入服務目錄,獲得最近編輯時間(一般都是比較大的檔案),但是并不是所有的系統都可以直接在伺服器端随意通路的,使用者也可以使用如下SQL語句,來獲得trace檔案的名字,到時候可以讓DBA幫你拷貝出來。
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc' trace_file_name
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = &SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d
那麼,拿到了這個trace檔案我們該怎麼處理呢?一般情況下,如果沒有足夠的經驗是不會直接打開那包含密密麻麻火星文的trc檔案的,我們可以使用tkprof來格式化這個檔案 如果你需要直接對該跟蹤檔案格式進行檢視可以參考:http://blog.csdn.net/liufeng1980423/article/details/6074521
我們首先來看看tkprof的參數解釋
sys參數,如果不指定預設值為yes.這個參數的含義是,輸出檔案中是否包含以SYS使用者運作的sql語句。這個參數還是蠻有用的,我們執行sql語句的時候,背景經常會執行很多遞歸的語句,比如你輸入了SELECT * FROM TEST;如果這個語句是硬解析的話,那麼會産生很多遞歸的SQL,遞歸的去查詢表的統計資訊,列的統計資訊,索引的統計資訊等,當然遞歸的不止是這些。這些遞歸的sql都是以SYS使用者運作的,如果你不希望看到這些遞歸SQL,那麼就加上這個參數sys=no.
record參數,它指定的是一個路徑下的檔案,這個檔案用來生成在跟蹤檔案中找到的所有的非遞歸SQL。比如你在SQLPLUS裡執行了三條語句,select * from a;select * from b;select * from c;,那麼如果你指定了這個參數如:record=c:\test.log,那麼你用tkprof格式化跟蹤檔案後,這個test.log裡就會記錄這三個SQL。這個特性在有些時候還是滿有用的,因為跟蹤檔案往往都會比較大,找起來會比較費勁,我們可以通過指定這個參數先大體了解下,跟蹤檔案裡都有哪些非遞歸SQL。而且這個功能還有助于我們重演SQL語句(綁定變量的不可以)。
aggregate參數,它指定tkprof是否将同樣文本内容的sql聚合處理,比如,你執行了十次select * from a,如果你指定這個參數為no(預設情況),那麼産生的輸出檔案會有十個這樣語句的執行資訊,如果你指定的是yes,那麼tkprof會把這十次的執行資訊彙總顯示。這個參數怎麼指定就看你的需要了,個人覺得還是滿有用的一個參數。
sort參數,這個參數是經常使用到的一個參數,它用來指定tkprof輸出檔案裡sql語句按照什麼排序,預設是按照執行的先後順序排序的,我們可以指定它按照其他方式排序,比如磁盤讀取數,CPU時間等。這個參數最經常用的方式是:sort=prsela,exeela,fchela,其實這三個值加起來就是響應時間,即按照響應時間排序。這裡别産生誤解,tkprof會根據prsela,exeela,fchela三個值的和進行排序,而不是像SQL語句似的一個個的排序。
print參數,它經常搭配sort參數一起使用,用來指定tkprof輸出sql語句的數量。這兩個參數搭配使用起來就比較妙,比如你想知道一個跟蹤檔案裡響應時間排前十的SQL,那麼你就可以sort=prsela,exeela,fchela print=10來搭配使用。
explain參數,這個參數的含義是為每一個SQL提供一個執行計劃。使用的方法是explain=使用者名/密碼,其實原理很簡單,就是通過你指定的使用者名,密碼登陸資料庫,然後為每一個sql執行以下explain plan for sql,輸出到plan_table裡,最後添加到輸出檔案裡。注意,由于explain plan for 指令要求執行操作的使用者要對sql語句裡包含的對象都有執行權限,如果包含視圖,也要對視圖基于的基礎表有執行權限,否則産生不了執行計劃。注意增加了這個參數後,執行tkprof會比較慢。
wait參數,指定輸出檔案中包含不包含等待事件,預設是包含的。一般都取預設值。
那麼格式化後的
TKPROF: Release 11.2.0.1.0 - Development on 星期一 11月 7 11:37:34 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Trace file: c:\1.trc
Sort options: default
********************************************************************************
count = number of times OCI procedure was executed
cpu = cpu time in seconds executing
elapsed = elapsed time in seconds executing
disk = number of physical reads of buffers from disk
query = number of buffers gotten for consistent read
current = number of buffers gotten in current mode (usually for update)
rows = number of rows processed by the fetch or execute call
********************************************************************************
SQL ID: 3nkd3g3ju5ph1
Plan Hash: 2853959010
select obj#,type#,ctime,mtime,stime, status, dataobj#, flags, oid$, spare1,
spare2
from
obj$ where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null
and linkname is null and subname is null
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 7 0.00 0.00 0 0 0 0
Execute 129 0.03 0.04 0 0 0 0
Fetch 129 0.00 0.17 37 510 0 123
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 265 0.03 0.22 37 510 0 123
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: CHOOSE
Parsing user id: SYS (recursive depth: 1)
Rows Row Source Operation
------- ---------------------------------------------------
0 TABLE ACCESS BY INDEX ROWID OBJ$ (cr=3 pr=1 pw=0 time=0 us cost=4 size=83 card=1)
0 INDEX RANGE SCAN I_OBJ2 (cr=3 pr=1 pw=0 time=0 us cost=3 size=0 card=1)(object id 37)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
db file sequential read 37 0.05 0.15
********************************************************************************
相關參數解釋
CALL:每次SQL語句的處理都分成三個部分
Parse:這步将SQL語句轉換成執行計劃,包括檢查是否有正确的授權和所需要用到的表、列以及其他引用到的對象是否存在。
Execute:這步是真正的由Oracle來執行語句。對于insert、update、delete操作,這步會修改資料,對于select操作,這步就隻是确定選擇的記錄。
Fetch:傳回查詢語句中所獲得的記錄,這步隻有select語句會被執行。
COUNT:這個語句被parse、execute、fetch的次數。
CPU:這個語句對于所有的parse、execute、fetch所消耗的cpu的時間,以秒為機關。
ELAPSED:這個語句所有消耗在parse、execute、fetch的總的時間。
DISK:從磁盤上的資料檔案中實體讀取的塊的數量。一般來說更想知道的是正在從緩存中讀取的資料而不是從磁盤上讀取的資料。
QUERY:在一緻性讀模式下,所有parse、execute、fetch所獲得的buffer的數量。一緻性模式的buffer是用于給一個長時間運作的事務提供一個一緻性讀的快照,緩存實際上在頭部存儲了狀态。
CURRENT:在current模式下所獲得的buffer的數量。一般在current模式下執行insert、update、delete操作都會擷取buffer。在current模式下如果在高速緩存區發現有新的緩存足夠給目前的事務使用,則這些buffer都會被讀入了緩存區中。
ROWS: 所有SQL語句傳回的記錄數目,但是不包括子查詢中傳回的記錄數目。對于select語句,傳回記錄是在fetch這步,對于insert、update、delete操作,傳回記錄則是在execute這步。
其中比較有用的一個排序選項是fchela,即按照elapsed time fetching來對分析的結果排序(記住要設定初始化參數timed_statistics=true),生成的檔案将把最消耗時間的sql放在最前面顯示。另外一個有用的參數就是sys,這個參數設定為no可以阻止所有以sys使用者執行的sql被顯示出來,這樣可以減少分析出來的檔案的複雜度,便于檢視。
比如:tkprof c:\1.trc sys=no sort=prsela,exeela,fchela print=10 上面就是不顯示SYS使用者的SQL,排列出前10個SQL語句,按照prsela,exela,fchela執行時間的總和順序,如果這樣的話,我們是不是可以把最耗時的SQL語句來分析,也可以獲得一些導緻性能下降的因素。
-------------------------------------------------------------------------------------------------------
版權所有,文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!
-------------------------------------------------------------------------------------------------------