遇到需要排查一個系統(tǒng)使用sql的情況,可以通過查詢Oracle的$sql
芝硬、$ssssion
、$sqlarea
進(jìn)行統(tǒng)計排查
排查時可以先看一下$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 //當(dāng)前正在執(zhí)行的游標(biāo)的sql文本的前1000個字符
SQL_FULLTEXT //CLOB類型 整個sql文本轧房,不用借助于V$SQL_TEXT視圖來查看整個文本
SQL_ID //庫緩存中的SQL父游標(biāo)的標(biāo)志
SHARABLE_MEM //子游標(biāo)使用的共享內(nèi)存的大小,bytes
PERSISTENT_MEM //子游標(biāo)生存時間中使用的固定內(nèi)存的總量,bytes
RUNTIME_MEM //在子游標(biāo)執(zhí)行過程中需要的固定內(nèi)存大小吵取,bytes
SORTS //子游標(biāo)發(fā)生的排序數(shù)量
LOADED_VERSIONS // 顯示上下文堆是否載入,1是锯厢,0否
USERS_OPENING // 執(zhí)行這個sql的用戶數(shù)
FETCHES // sql取數(shù)據(jù)的次數(shù)
EXECUTIONS //自從被載入共享池后,sql執(zhí)行的次數(shù)
FIRST_LOAD_TIME // 父游標(biāo)產(chǎn)生的時間戳
PARSE_CALLS //解析調(diào)用的次數(shù)
DISK_CALLS //讀磁盤的次數(shù)
DIRECT_WRITES //直接寫的次數(shù)
BUFFER_GETS //直接從buffer中得到數(shù)據(jù)的次數(shù)
APPLICATION_WAIT_TIME // 應(yīng)用等待時間脯倒,毫秒
CONCURRENCY_WAIT_TIME //并發(fā)等待時間实辑,毫秒
USER_IO_WAIT_TIME //用戶IO等待時間
ROWS_PROCESSED SQL //解析sql返回的總行數(shù)
OPTIMIZER_MODE //優(yōu)化器模式
OPTIMIZER_COST //優(yōu)化器對于sql給出的成本
PARSING_USER_ID //第一個創(chuàng)建這個子游標(biāo)的用戶id
HASH_VALUES //解析產(chǎn)生的哈希值
CHILD_NUMBER //該子游標(biāo)的數(shù)量
SERVICE //服務(wù)名
CPU_TIME //該子游標(biāo)解析,執(zhí)行和獲取數(shù)據(jù)使用的CPU時間藻丢,毫秒
ELAPSED_TIME //sql的執(zhí)行時間剪撬,毫秒
INVALIDATIONS //該子游標(biāo)的無效次數(shù)
MODULE //第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設(shè)置的模塊名
ACTION //第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設(shè)置的動作名
IS_OBSOLETE //標(biāo)記該子游標(biāo)過期與否,當(dāng)子游標(biāo)過大時會發(fā)生這種情況
is_bind_sensitive //不僅指出是否使用綁定變量窺測來生成執(zhí)行計劃悠反,而且指出這個執(zhí)行計劃是否依賴于窺測到的值残黑。如果是,這個字段會被設(shè)置為Y斋否,否則會被設(shè)置為N梨水。
is_bind_aware //表明游標(biāo)是否使用了擴(kuò)展的游標(biāo)共享。如果是茵臭,這個字段會被設(shè)置為Y疫诽,如果不是,這個字段會被設(shè)置為N。如果是設(shè)置為N奇徒,這個游標(biāo)將被廢棄雏亚,不再可用。
is_shareable //表明游標(biāo)能否被共享摩钙。如果可以罢低,這個字段會被設(shè)置為Y,否則胖笛,會被設(shè)置為N网持。如果被設(shè)置為N,這個游標(biāo)將被廢棄匀钧,不再可用翎碑。
去Oracle的sql共享池$sqlarea
查詢sql的執(zhí)行次數(shù),分析SQL執(zhí)行性能
EXECUTIONS :所有子游標(biāo)執(zhí)行SQL的次數(shù)
DISK_READS:所有子游標(biāo)執(zhí)行SQL需要讀的硬盤次數(shù)
BUFFER_GETS :所有子游標(biāo)執(zhí)行SQL需要讀的內(nèi)存次數(shù)
ELAPSED_TIME:所有子游標(biāo)執(zhí)行SQL需要的時間
分析SQL執(zhí)行性能
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):求每個游標(biāo)執(zhí)行SQL需要的時間
ROUND(DISK_READS / EXECUTIONS, 2):求每個游標(biāo)執(zhí)行SQL需要讀磁盤的次數(shù)
ROUND(BUFFER_GETS / EXECUTIONS , 2):求每個游標(biāo)執(zhí)行SQL需要讀內(nèi)存的次數(shù)
ROUND((BUFFER_GETS - DISK_READS) / BUFFER_GETS, 2) :SQL命中率
所有歸納一下之斯,就是去$sqlarea共享池查詢統(tǒng)計日杈,然后分析sql,上述數(shù)據(jù)越低就說明SQL執(zhí)行速度越高佑刷,性能越好