一、Oracle數(shù)據(jù)庫運(yùn)行越來越慢的優(yōu)化方法
1、應(yīng)用層優(yōu)化
應(yīng)用程序的設(shè)計(jì)和開發(fā)中,可以采用合理的數(shù)據(jù)查詢語句來減少數(shù)據(jù)庫的 I/O 操作次數(shù),例如通過合并多個(gè) SQL 語句或使用批量操作等方式來優(yōu)化查詢效率。同時(shí),在應(yīng)用程序中適當(dāng)使用緩存技術(shù),減輕數(shù)據(jù)庫負(fù)載。
2、數(shù)據(jù)庫層優(yōu)化
Oracle 數(shù)據(jù)庫在運(yùn)維過程中可以通過優(yōu)化數(shù)據(jù)表結(jié)構(gòu)、調(diào)整索引、升級數(shù)據(jù)庫版本、重新啟動數(shù)據(jù)庫實(shí)例等方式來提高性能。具體而言,例如在設(shè)計(jì)表結(jié)構(gòu)時(shí)盡量避免多表關(guān)聯(lián)查詢,優(yōu)化查詢語句,減少鎖定等待時(shí)間。
3、內(nèi)存層優(yōu)化
調(diào)整數(shù)據(jù)庫的緩存和內(nèi)存設(shè)置是提高 Oracle 數(shù)據(jù)庫性能的關(guān)鍵,例如增加共享池和高速緩存的大小,以及啟用自動 PGA(程序全局區(qū))管理功能等。優(yōu)化這些參數(shù),可以減少數(shù)據(jù)庫的磁盤 I/O 操作,提高訪問速度。
4、存儲層優(yōu)化
除了進(jìn)行數(shù)據(jù)庫、應(yīng)用和內(nèi)存層面的優(yōu)化外,還可以通過在存儲設(shè)備上進(jìn)行調(diào)整,在存儲層面上提高 Oracle 數(shù)據(jù)庫的性能。例如使用 RAID 磁盤陣列來提高磁盤 I/O 效率,使用快速的存儲介質(zhì)如 SSD 來強(qiáng)化存儲性能等。
二、Oracle數(shù)據(jù)庫性能檢查方法
1、檢查數(shù)據(jù)庫的等待事件
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%';
如果數(shù)據(jù)庫長時(shí)間持續(xù)出現(xiàn)大量像 latch free,enqueue,buffer busy waits, db file sequential read,db file scattered read 等等待事件時(shí),需要對其進(jìn)行分析,可能存在問題的語句。
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、等待時(shí)間非常多的 5 個(gè)系統(tǒng)等待事件的獲取
SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM<=5;
5、檢查運(yùn)行很久的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較高的進(jìn)程
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、檢查文件系統(tǒng)的 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:數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)模型
層次模型:是數(shù)據(jù)庫系統(tǒng)中較早出現(xiàn)的數(shù)據(jù)模型,層次數(shù)據(jù)庫系統(tǒng)采用層次模型作為數(shù)據(jù)的組織方式。它采用樹形結(jié)構(gòu)來表示各類實(shí)體以及實(shí)體間的聯(lián)系。網(wǎng)狀數(shù)據(jù)模型:用有向圖表示實(shí)體和實(shí)體之間的聯(lián)系的數(shù)據(jù)結(jié)構(gòu)模型稱為網(wǎng)狀數(shù)據(jù)模型。關(guān)系型數(shù)據(jù)模型:關(guān)系型數(shù)據(jù)模型對應(yīng)的數(shù)據(jù)庫自然就是關(guān)系型數(shù)據(jù)庫了,這是目前應(yīng)用非常多的數(shù)據(jù)庫,使用表格表示實(shí)體和實(shí)體之間關(guān)系的數(shù)據(jù)模型稱之為關(guān)系數(shù)據(jù)模型。