Oracle sql共享池$sqlarea分析SQL資源使用情況
遇到需要排查一個系統使用sql的情況,可以通過查詢Oracle的$sql
、$ssssion
、$sqlarea
進行統計排查
排查時可以先看一下$sql
和$session
的基本資訊
select * from v$sql a, v$session b where b.SQL_ADDRESS = a.ADDRESS and b.SQL_HASH_VALUE = a.HASH_VALUE and b.SQL_CHILD_NUMBER = a.CHILD_NUMBER
$sqlarea表列意思:
引用:https://blog.csdn.net/study4034/article/details/51331120
SQL_TEXT//當前正在執行的遊標的sql文字的前1000個字元
SQL_FULLTEXT//CLOB型別 整個sql文字,不用藉助於V$SQL_TEXT檢視來檢視整個文字
SQL_ID//庫快取中的SQL父遊標的標誌
SHARABLE_MEM//子游標使用的共享記憶體的大小,bytes
PERSISTENT_MEM//子游標生存時間中使用的固定記憶體的總量,bytes
RUNTIME_MEM//在子游標執行過程中需要的固定記憶體大小,bytes
SORTS//子游標發生的排序數量
LOADED_VERSIONS// 顯示上下文堆是否載入,1是,0否
USERS_OPENING// 執行這個sql的使用者數
FETCHES// sql取資料的次數
EXECUTIONS//自從被載入共享池後,sql執行的次數
FIRST_LOAD_TIME// 父遊標產生的時間戳
PARSE_CALLS//解析呼叫的次數
DISK_CALLS//讀磁碟的次數
DIRECT_WRITES//直接寫的次數
BUFFER_GETS//直接從buffer中得到資料的次數
APPLICATION_WAIT_TIME// 應用等待時間,毫秒
CONCURRENCY_WAIT_TIME//併發等待時間,毫秒
USER_IO_WAIT_TIME//使用者IO等待時間
ROWS_PROCESSED SQL//解析sql返回的總行數
OPTIMIZER_MODE//優化器模式
OPTIMIZER_COST//優化器對於sql給出的成本
PARSING_USER_ID//第一個建立這個子游標的使用者id
HASH_VALUES//解析產生的雜湊值
CHILD_NUMBER//該子游標的數量
SERVICE//服務名
CPU_TIME//該子游標解析,執行和獲取資料使用的CPU時間,毫秒
ELAPSED_TIME//sql的執行時間,毫秒
INVALIDATIONS//該子游標的無效次數
MODULE//第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設定的模組名
ACTION//第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設定的動作名
IS_OBSOLETE//標記該子游標過期與否,當子游標過大時會發生這種情況
is_bind_sensitive//不僅指出是否使用繫結變數窺測來生成執行計劃,而且指出這個執行計劃是否依賴於窺測到的值。如果是,這個欄位會被設定為Y,否則會被設定為N。
is_bind_aware//表明遊標是否使用了擴充套件的遊標共享。如果是,這個欄位會被設定為Y,如果不是,這個欄位會被設定為N。如果是設定為N,這個遊標將被廢棄,不再可用。
is_shareable//表明遊標能否被共享。如果可以,這個欄位會被設定為Y,否則,會被設定為N。如果被設定為N,這個遊標將被廢棄,不再可用。
去Oracle的sql共享池$sqlarea
查詢sql的執行次數,分析SQL執行效能
EXECUTIONS :所有子游標執行SQL的次數
DISK_READS:所有子游標執行SQL需要讀的硬碟次數
BUFFER_GETS :所有子游標執行SQL需要讀的記憶體次數
ELAPSED_TIME:所有子游標執行SQL需要的時間
分析SQL執行效能
SELECT SQL_TEXT, SQL_FULLTEXT, ELAPSED_TIME, DISK_READS, BUFFER_GETS, EXECUTIONS, Round(ELAPSED_TIME / EXECUTIONS ,2), ROUND(DISK_READS / EXECUTIONS, 2), ROUND(BUFFER_GETS / EXECUTIONS , 2), ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2) FROM V$SQLAREA WHERE EXECUTIONS > 0 AND BUFFER_GETS > 0 AND (BUFFER_GETS - DISK_READS) / BUFFER_GETS < 0.8 ORDER BY Round(ELAPSED_TIME / EXECUTIONS ,2) desc;
然後解釋一下這些意義:
Round(ELAPSED_TIME / EXECUTIONS ,2):求每個遊標執行SQL需要的時間
ROUND(DISK_READS / EXECUTIONS, 2):求每個遊標執行SQL需要讀磁碟的次數
ROUND(BUFFER_GETS / EXECUTIONS , 2):求每個遊標執行SQL需要讀記憶體的次數
ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2) :SQL命中率
所有歸納一下,就是去$sqlarea共享池查詢統計,然後分析sql,上述資料越低就說明SQL執行速度越高,效能越好