今天主要介紹幾個sql,可能很多人就收藏一下但很少會去用,所以結合案例來做一下分析,這樣就知道在什麼場景用了。
下面介紹一下案例。
1、監控分析
從監控發現物理IO讀處于比較高的水平,截圖如下:物理讀基本保持在幾十M,物理寫很少。
2、觀察AWR報告
這裡拿了對應的awr報告,簡單看下邏輯讀和物理讀情況。
從這個截圖我們隻計算下邏輯讀和物理讀:
1.邏輯讀大小:56222*8192/1024/1024=439M/s
2.物理讀大小:7173*8192/1024/1024=56M/s
假設這裡物理讀将近邏輯讀一半,因為在一般系統中很難得到這個比例,那就證明物理讀過高了,這裡因為不是高峰期,所以不怎麼看得出來。
下面看下具體的sql情況。
邏輯讀前10的SQL
SELECT * FROM (SELECT sql_fulltext AS sql, SQL_ID, buffer_gets / executions AS "Gets/Exec", buffer_gets, executions, cpu_time, elapsed_time, last_active_time, module FROM V$SQLAREA WHERE buffer_gets > 10000 and executions > 0 ORDER BY "Gets/Exec" DESC) WHERE rownum <= 10;
個别參數說明:
SQL_FULLTEXT //CLOB類型 整個sql文本,不用借助于V$SQL_TEXT視圖來查看整個文本 SQL_ID //庫緩存中的SQL父遊标的标志 FETCHES // sql取數據的次數 EXECUTIONS //自從被載入共享池後,sql執行的次數 CPU_TIME //該子遊标解析,執行和獲取數據使用的CPU時間,毫秒 ELAPSED_TIME //sql的執行時間,毫秒 v$sqlarea的字段定義和v$sql基本一緻,不同的是V$SQLAREA是在父遊标級别上統計的sql信息,v$sql的彙總表,進行了group by hash_value,sql_id的彙總。
物理讀(磁盤讀寫)前10的sql
SELECT * FROM (SELECT sql_fulltext AS sql, SQL_ID, disk_reads / executions AS "Reads/Exec", disk_reads, executions,cpu_time,elapsed_time,last_active_time,module FROM V$SQLAREA WHERE disk_reads > 1000 and executions > 0 AND is_obsolete = 'N' ORDER BY "Reads/Exec" DESC) WHERE rownum <= 10;
物理IO前10的表
SELECT TABLE_NAME,TOTAL_PHYS_IO FROM ( SELECT OWNER||'.'||OBJECT_NAME AS TABLE_NAME, SUM(VALUE) AS TOTAL_PHYS_IO FROM V$SEGMENT_STATISTICS WHERE OWNER!='SYS' AND OBJECT_TYPE='TABLE' AND STATISTIC_NAME IN ('physical reads','physical reads direct', 'physical writes','physical writes direct') GROUP BY OWNER||'.'||OBJECT_NAME ORDER BY TOTAL_PHYS_IO DESC) WHERE ROWNUM <=10;
篇幅有限,主要分享幾個sql,所以就介紹到這了,後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注下~
,