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