SQL語句大全—oracle數據庫性能監控(六)

oracle數據庫性能監控的SQL
1. 監控事例的等待
SQL> SELECT EVENT,SUM(DECODE(WAIT_TIME,
0,0,1)) "PREV",SUM(DECODE(WAIT_TIME,0,1,0)) "CURR",COUNT(*) "TOT" FROM V$SESSION_WAIT GROUP BY EVENT ORDER BY 4;

2. 回滾段的爭用情況
SQL> SELECT NAME, WAITS, GETS, WAITS/GETS "RATIO" FROM V$ROLLSTAT A, V$ROLLNAME B WHERE A.USN = B.USN;

3. 監控表空間的 I/O 比例
SQL> SELECT DF.TABLESPACE_NAME NAME,DF.FILE_NAME "FILE",F.PHYRDS PYR,
F.PHYBLKRD PBR,F.PHYWRTS PYW, F.PHYBLKWRT PBW FROM V$FILESTAT F, DBA_DATA_FILES DF WHERE F.FILE# = DF.FILE_ID
ORDER BY DF.TABLESPACE_NAME;


4. 監控文件系統的 I/O 比例
SQL> SELECT SUBSTR(A.FILE#,
1,2) "#", SUBSTR(A.NAME,1,30) "NAME",
A.STATUS,A.BYTES,B.PHYRDS,B.PHYWRTS FROM V$DATAFILE A, V$FILESTAT B
WHERE A.FILE# = B.FILE#;

5.在某個用戶下找所有的索引
SQL> SELECT USER_INDEXES.TABLE_NAME, USER_INDEXES.INDEX_NAME,UNIQUENESS, COLUMN_NAME FROM USER_IND_COLUMNS, USER_INDEXES WHERE USER_IND_COLUMNS.INDEX_NAME = USER_INDEXES.INDEX_NAME
AND USER_IND_COLUMNS.TABLE_NAME = USER_INDEXES.TABLE_NAME
ORDER BY USER_INDEXES.TABLE_TYPE, USER_INDEXES.TABLE_NAME,
USER_INDEXES.INDEX_NAME, COLUMN_POSITION;

6. 監控 SGA 的命中率
SQL> SELECT A.VALUE + B.VALUE "LOGICAL_READS", C.VALUE "PHYS_READS",
ROUND(
100 * ((A.VALUE+B.VALUE)-C.VALUE) / (A.VALUE+B.VALUE)) "BUFFER HIT RATIO" FROM V$SYSSTAT A, V$SYSSTAT B, V$SYSSTAT C WHERE A.STATISTIC# = 38 AND B.STATISTIC# = 39 AND C.STATISTIC# = 40;

7. 監控 SGA 中字典緩衝區的命中率
SQL> SELECT PARAMETER, GETS,GETMISSES , GETMISSES/(GETS+GETMISSES)*
100 "MISS RATIO",(1-(SUM(GETMISSES)/ (SUM(GETS)+SUM(GETMISSES))))*100 "HIT RATIO" FROM V$ROWCACHE WHERE GETS+GETMISSES <>0 GROUP BY PARAMETER, GETS, GETMISSES;

8. 監控 SGA 中共享緩存區的命中率,應該小於1%
SQL> SELECT SUM(PINS) "TOTAL PINS", SUM(RELOADS) "TOTAL RELOADS",
SUM(RELOADS)/SUM(PINS) *
100 LIBCACHE FROM V$LIBRARYCACHE;

SQL> SELECT SUM(PINHITS-RELOADS)/SUM(PINS) "HIT RADIO",SUM(RELOADS)/SUM(PINS) "RELOAD PERCENT" FROM V$LIBRARYCACHE;

9. 顯示所有數據庫對象的類別和大小
SQL> SELECT COUNT(NAME) NUM_INSTANCES ,TYPE ,SUM(SOURCE_SIZE) SOURCE_SIZE,SUM(PARSED_SIZE) PARSED_SIZE ,SUM(CODE_SIZE) CODE_SIZE ,SUM(ERROR_SIZE) ERROR_SIZE,SUM(SOURCE_SIZE) +SUM(PARSED_SIZE) +SUM(CODE_SIZE) +SUM(ERROR_SIZE) SIZE_REQUIRED FROM DBA_OBJECT_SIZE GROUP BY TYPE ORDER BY
2;

10. 監控 SGA 中重做日誌緩存區的命中率,應該小於1%
SQL> SELECT NAME,
       GETS,
       MISSES,
       IMMEDIATE_GETS,
       IMMEDIATE_MISSES,
       DECODE(GETS,
0, 0, MISSES / GETS * 100) RATIO1,
       DECODE(IMMEDIATE_GETS + IMMEDIATE_MISSES,
              
0,
              
0,
              IMMEDIATE_MISSES / (IMMEDIATE_GETS + IMMEDIATE_MISSES) *
100) RATIO2
FROM V$LATCH
WHERE NAME IN (
'REDO ALLOCATION', 'REDO COPY');

11.  監控內存和硬盤的排序比率,最好使它小於 .10,增加 sort_area_size
SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME IN (
'SORTS (MEMORY)', 'SORTS (DISK)');

12. 監控當前數據庫誰在運行什麼SQL語句
SQL> SELECT OSUSER, USERNAME, SQL_TEXT FROM V$SESSION A, V$SQLTEXT B
WHERE A.SQL_ADDRESS =B.ADDRESS ORDER BY ADDRESS, PIECE;

13. 監控字典緩衝區
SQL>SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
SQL>SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
SQL>SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;
(後者除以前者,此比率小於1%,接近0%爲好)
SQL>SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES" FROM V$ROWCACHE;

14. 查找ORACLE字符集
SQL>SELECT * FROM SYS.PROPS$ WHERE NAME=
'NLS_CHARACTERSET';

15. 監控 MTS
SQL>SELECT BUSY/(BUSY+IDLE) "SHARED SERVERS BUSY" FROM V$DISPATCHER;
(此值大於0.5時,參數需加大)
SQL>SELECT SUM(WAIT)/SUM(TOTALQ) "DISPATCHER WAITS" FROM V$QUEUE WHERE TYPE=
'DISPATCHER';
SQL>SELECT COUNT(*) FROM V$DISPATCHER;
SQL>SELECT SERVERS_HIGHWATER FROM V$MTS;
(servers_highwater接近mts_max_servers時,參數需加大)

16. 碎片程度
SQL>SELECT TABLESPACE_NAME,COUNT(TABLESPACE_NAME) FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME HAVING COUNT(TABLESPACE_NAME)>
10;
SQL>ALTER TABLESPACE NAME COALESCE;
SQL>ALTER TABLE NAME DEALLOCATE UNUSED;
SQL>CREATE OR REPLACE VIEW TS_BLOCKS_V AS
SELECT TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS,
'FREE SPACE' SEGMENT_NAME FROM DBA_FREE_SPACE
    UNION ALL
SELECT TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS,SEGMENT_NAME FROM DBA_EXTENTS;

SELECT * FROM TS_BLOCKS_V;

SQL>SELECT TABLESPACE_NAME,SUM(BYTES),MAX(BYTES),COUNT(BLOCK_ID) FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;

查看碎片程度高的表
SQL>SELECT SEGMENT_NAME TABLE_NAME,COUNT(*) EXTENTS
FROM DBA_SEGMENTS WHERE OWNER NOT IN (
'SYS', 'SYSTEM') GROUP BY SEGMENT_NAME HAVING COUNT(*)=(SELECT MAX(COUNT(*)) FROM DBA_SEGMENTS GROUP BY SEGMENT_NAME);

17. 表、索引的存儲情況檢查
SQL>SELECT SEGMENT_NAME,SUM(BYTES),COUNT(*) EXT_QUAN FROM DBA_EXTENTS WHERE TABLESPACE_NAME=
'&TABLESPACE_NAME' AND SEGMENT_TYPE='TABLE' GROUP BY TABLESPACE_NAME,SEGMENT_NAME;

SQL>SELECT SEGMENT_NAME,COUNT(*) FROM DBA_EXTENTS WHERE SEGMENT_TYPE=
'INDEX' AND OWNER='&OWNER' GROUP BY SEGMENT_NAME;

18、找使用CPU多的用戶session
SQL>SELECT A.SID,SPID,STATUS,SUBSTR(A.PROGRAM,
1,40) PROG,A.TERMINAL,OSUSER,VALUE/60/100 VALUE FROM V$SESSION A,V$PROCESS B,V$SESSTAT C
WHERE C.STATISTIC#=
12 AND C.SID=A.SID AND A.PADDR=B.ADDR ORDER BY VALUE DESC;


表空間統計
A    腳本說明:
這是我最常用的一個腳本,用它可以顯示出數據庫中所有表空間的狀態,如表空間的大小、已使用空間、使用的百分比、空閒空間數及現在表空間的最大塊是多大。

B、腳本原文:

SELECT UPPER(F.TABLESPACE_NAME) "表空間名"
D.TOT_GROOTTE_MB "
表空間大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "
已使用空間(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB *
100,2),'990.99') "使用比",
F.TOTAL_BYTES "
空閒空間(M)",
F.MAX_BYTES "
最大塊(M)"
FROM     
(SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES)/(
1024*1024),2) TOTAL_BYTES,
ROUND(MAX(BYTES)/(
1024*1024),2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES)/(
1024*1024),2) TOT_GROOTTE_MB
FROM   SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME    
ORDER BY
4 DESC;

查看無法擴展的段
A 腳本說明:
ORACLE對一個段比如表段或索引無法擴展時,取決的並不是表空間中剩餘的空間是多少,而是取於這些剩餘空間中最大的塊是否夠表比索引的“NEXT”值大,所以有時一個表空間剩餘幾個G的空閒空間,在你使用時ORACLE還是提示某個表或索引無法擴展,就是由於這一點,這時說明空間的碎片太多了。這個腳本是找出無法擴展的段的一些信息。

B、腳本原文:

SELECT SEGMENT_NAME,
SEGMENT_TYPE,
OWNER,
A.TABLESPACE_NAME "TABLESPACENAME",
INITIAL_EXTENT/
1024 "INITAL_EXTENT(K)",
NEXT_EXTENT/
1024 "NEXT_EXTENT(K)",
PCT_INCREASE,
B.BYTES/
1024 "TABLESPACE MAX FREE SPACE(K)",
B.SUM_BYTES/
1024 "TABLESPACE TOTAL FREE SPACE(K)"
FROM DBA_SEGMENTS A,
(SELECT TABLESPACE_NAME,MAX(BYTES) BYTES,SUM(BYTES) SUM_BYTES FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) B
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND NEXT_EXTENT>B.BYTES
ORDER BY
4,3,1;

查看段(表段、索引段)所使用空間的大小
A 腳本說明:
有時你可能想知道一個表或一個索引佔用多少M的空間,這個腳本就是滿足你的要求的,把<>中的內容替換一下就可以了。

B、腳本原文:

SELECT OWNER,
SEGMENT_NAME,
SUM(BYTES)/
1024/1024
FROM DBA_SEGMENTS
WHERE OWNER=
AND SEGMENT_NAME=
GROUP BY OWNER,SEGMENT_NAME
ORDER BY
3 DESC;

查看數據庫中的表鎖
A 腳本說明:
這方面的語句的樣式是很多的,各式一樣,不過我認爲這個是最實用的,不信你就用一下,無需多說,鎖是每個DBA一定都涉及過的內容,當你相知道某個表被哪個session鎖定了,你就用到了這個腳本。

B、腳本原文

SELECT A.OWNER,   
A.OBJECT_NAME,   
B.XIDUSN,   
B.XIDSLOT,   
B.XIDSQN,   
B.SESSION_ID,   
B.ORACLE_USERNAME,   
B.OS_USER_NAME,   
B.PROCESS,   
B.LOCKED_MODE,   
C.MACHINE,   
C.STATUS,   
C.SERVER,   
C.SID,   
C.SERIAL#,   
C.PROGRAM
FROM ALL_OBJECTS A,   
V$LOCKED_OBJECT B,   
SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
-- AND
ORDER BY
1,2   ;   

處理存儲過程被鎖
A 腳本說明:
   
實際過程中可能你要重新編譯某個存儲過程理總是處於等待狀態,最後會報無法鎖定對象,這時你就可以用這個腳本找到鎖定過程的那個sid,需要注意的是查v$access這個視圖本來就很慢,需要一些布耐心。

B、腳本原文:

SELECT * FROM V$ACCESS
WHERE OWNER=
AND OBJECT
?

查看回滾段狀態
A 腳本說明
這也是DBA經常使用的腳本,因爲回滾段是online還是full是他們的關懷之列嘛
B、腳本原文:

SELECT A.SEGMENT_NAME,B.STATUS
FROM DBA_ROLLBACK_SEGS A,
V$ROLLSTAT B
WHERE A.SEGMENT_ID=B.USN
ORDER BY
2

看哪些session正在使用哪些回滾段
A 腳本說明:
當你發現一個回滾段處理full狀態,你想使它變回online狀態,這時你便會用alter rollback segment rbs_seg_name shrink,可很多時侯確shrink不回來,主要是由於某個session在用,這時你就用到了這個腳本,找到了sidserial#餘下的事就不用我說了吧。

B、腳本原文

SELECT R.NAME 回滾段名,
S.SID,
S.SERIAL#,
S.USERNAME
用戶名,
S.STATUS,
T.CR_GET,
T.PHY_IO,
T.USED_UBLK,
T.NOUNDO,
SUBSTR(S.PROGRAM,
1, 78) 操作程序
FROM SYS.V_$SESSION S,SYS.V_$TRANSACTION T,SYS.V_$ROLLNAME R
WHERE T.ADDR = S.TADDR AND T.XIDUSN = R.USN
-- AND R.NAME IN ('ZHYZ_RBS')
ORDER? BY T.CR_GET,T.PHY_IO

查看正在使用臨時段的session
A 腳本說明:
許多的時侯你在查看哪些段無法擴展時,回顯的結果是臨時段,或你做表空間統計時發現臨段表空間的可用空間幾乎爲0,這時按oracle的說法是你只有重新啓動數據庫才能回收這部分空間。實際過程中沒那麼複雜,使用以下這段腳本把佔用臨時段的session殺掉,然後用alter tablespace temp coalesce;這個語句就把temp表空間的空間回收回來了。

B 腳本原文

SELECT USERNAME,SID,SERIAL#,SQL_ADDRESS,MACHINE,PROGRAM,
TABLESPACE,SEGTYPE,CONTENTS FROM V$SESSION SE,V$SORT_USAGE SU
WHERE SE.SADDR=SU.SESSION_ADDR;

 
發佈了58 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章