一、Oracle數據庫運行越來越慢的優化方法
1、應用層優化
應用程序的設計和開發中,可以采用合理的數據查詢語句來減少數據庫的 I/O 操作次數,例如通過合并多個 SQL 語句或使用批量操作等方式來優化查詢效率。同時,在應用程序中適當使用緩存技術,減輕數據庫負載。
2、數據庫層優化
Oracle 數據庫在運維過程中可以通過優化數據表結構、調整索引、升級數據庫版本、重新啟動數據庫實例等方式來提高性能。具體而言,例如在設計表結構時盡量避免多表關聯查詢,優化查詢語句,減少鎖定等待時間。
3、內存層優化
調整數據庫的緩存和內存設置是提高 Oracle 數據庫性能的關鍵,例如增加共享池和高速緩存的大小,以及啟用自動 PGA(程序全局區)管理功能等。優化這些參數,可以減少數據庫的磁盤 I/O 操作,提高訪問速度。
4、存儲層優化
除了進行數據庫、應用和內存層面的優化外,還可以通過在存儲設備上進行調整,在存儲層面上提高 Oracle 數據庫的性能。例如使用 RAID 磁盤陣列來提高磁盤 I/O 效率,使用快速的存儲介質如 SSD 來強化存儲性能等。
二、Oracle數據庫性能檢查方法
1、檢查數據庫的等待事件
select sid,event,p1,p2,p3,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait where event not like 'SQL%' and event not like 'rdbms%';
如果數據庫長時間持續出現大量像 latch free,enqueue,buffer busy waits, db file sequential read,db file scattered read 等等待事件時,需要對其進行分析,可能存在問題的語句。
2、Disk Read較高的SQL語句的獲取
SELECT SQL_TEXT FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS) WHERE ROWNUM<=5 desc;
3、查找前十條性能差的sql
SELECT * FROM (SELECT PARSING_USER_ID EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS, SQL_TEXT FROM V$SQLAREA ORDER BY DISK_READS DESC) WHERE ROWNUM<10 ;
4、等待時間非常多的 5 個系統等待事件的獲取
SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM<=5;
5、檢查運行很久的SQL
COLUMN USERNAME FORMAT A12 COLUMN OPNAME FORMAT A16 COLUMN PROGRESS FORMAT A8
SELECT USERNAME,SID,OPNAME,ROUND(SOFAR*100 / TOTALWORK,0) || '%' AS PROGRESS,TIME_REMAINING,SQL_TEXT FROM V$SESSION_LONGOPS , V$SQL WHERE
TIME_REMAINING <> 0 AND SQL_ADDRESS=ADDRESS AND SQL_HASH_VALUE = HASH_VALUE;
6、檢查消耗CPU較高的進程
SET LINE 240 SET VERIFY OFF
COLUMN SID FORMAT 999 COLUMN PID FORMAT 999 COLUMN S_# FORMAT 999
COLUMN USERNAME FORMAT A9 HEADING "ORA USER"
COLUMN PROGRAM FORMAT A29 COLUMN SQL FORMAT A60
COLUMN OSNAME FORMAT A9 HEADING "OS USER"
SELECT P.PID PID,S.SID SID,P.SPID SPID,S.USERNAME USERNAME,S.OSUSER OSNAME,P.SERIAL# S_#,P.TERMINAL,P.PROGRAM PROGRAM,P.BACKGROUND,S.STATUS,RTRIM(SUBSTR(A.SQL_TEXT, 1, 80)) SQLFROM V$PROCESS P, V$SESSION S,V$SQLAREA A WHERE P.ADDR = S.PADDR AND S.SQL_ADDRESS = A.ADDRESS(+) AND P.SPID LIKE '%&1%';
7、檢查碎片程度高的表
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);
8、檢查表空間的 I/O 比例
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;
9、檢查文件系統的 I/O 比例
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#;
10、檢查死鎖及處理
select sid,serial#,username,SCHEMANAME,osuser,MACHINE, terminal,PROGRAM,owner,object_name,object_type,o.object_id from dba_objects o,v$locked_object l,v$session s
where o.object_id=l.object_id and s.sid=l.session_id;
延伸閱讀1:數據庫系統的數據模型
層次模型:是數據庫系統中較早出現的數據模型,層次數據庫系統采用層次模型作為數據的組織方式。它采用樹形結構來表示各類實體以及實體間的聯系。網狀數據模型:用有向圖表示實體和實體之間的聯系的數據結構模型稱為網狀數據模型。關系型數據模型:關系型數據模型對應的數據庫自然就是關系型數據庫了,這是目前應用非常多的數據庫,使用表格表示實體和實體之間關系的數據模型稱之為關系數據模型。