程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 詳解Oracle數據庫磁盤I/O優化

詳解Oracle數據庫磁盤I/O優化

編輯:Oracle數據庫基礎

監控數據庫的性能

在init.ora參數文件中設置TIMED_STATISTICS=TRUE 和在你的會話層設置ALTER SESSION SET STATISTICS=TRUE 。運行svrmgrl 用 connect internal 注冊,在你的應用系統正常活動期間,運行utlbstat.sql 開始統計系統活動,達到一定的時間後,執行utlestat.sql 停止統計。統計結果將產生在report.txt 文件中。(utlbstat.sql utlestat.sql 一般存放在$Oracle_HOME/RDBMS/ADMIN 子目錄下)

優化數據庫磁盤I/O

檢查系統的I/O問題

在UNIX系統中工具sar-d能檢查整個系統的iOStat(IO statistics),在NT系統上則使用性能監視器(Performance Monitor).

反映Oracle文件I/O的進程

使用V$FILESTAT確定Oracle數據文件I/O

SELECT NAME,PHYRDS,PHYWRTS FROM V$DATAFILE DF,V$FILESTAT FS WHERE DF.FILE#=FS.FILE# ;

使用分布I/O減少磁盤競爭

將數據文件和redo log文件分開

Striping 表數據

分開表和索引

減少與Oracle無關的磁盤I/O

避免動態空間管理

在創建如表或回滾段的數據庫實體時,在數據庫中會為這些數據分配空間,該空間被稱為段。如果數據庫操作引起數據增加並超出了分配的表空間,Oracle會擴展該段,動態擴展會降低系統性能。

確定動態擴展

select name,value from v$sysstat where name=’recursive calls’ ;

分配分區

確定實體的最大大小;

選擇存儲參數值,使Oracle分配足夠大的分區,在創建實體時可以裝入所有數據

避免回滾段的動態空間管理

回滾段大小由其存儲參數所決定,回滾段必須能保存所有交易的回滾入口;

使用set transaction 命令可以為回滾段賦予交易的合適的大小;

對長的查詢的修改數據,應賦予大的回滾段,以保持所有的回滾入口;

對OLTP交易,由於頻繁交易,每個交易只修改小量的數據,因此賦予小的回滾段。

減少遷移和鏈接行

1. 使用ANALYZE 收集遷移和鏈接行的信息;

2. 查詢輸出表:chained_rows;

3. 如果有許多遷移和鏈接行,就需要消除遷移行,方法如下:

A. 創建與原表相同列的中間表,以保存遷移和鏈接行;

B. 從原表中刪除遷移和鏈接行;

C. 將中間表中的行插入到原表中;

D. 刪除中間表

4. 刪除第一步收集的信息;

5. 重新使用ANALYZE命令查詢輸出表

6. 在輸出表中出現的行都是鏈接行,只能通過增加數據塊的大小來清除。

調整排序

內存中排序

使用動態表V$SYSSTAT的信息反映排序

SELECT NAME , VALUE FROM V$SYSSTAT WHERE NAME IN (‘SORTS(MEMORY)’,’SORTS(DISK)’) ;

SORTS(MEMORY)-不需要使用I/O操作而完全在內存完成的排序數;

SORTS(DISK)-需要使用I/O操作與磁盤臨時段才能完成數據的排序數目。

增大SORT_AREA_SIZE以避免磁盤排序

使用NOSORT創建非排序的索引

CREATE INDEX INDEX_NAME ON TABLE TABLE_NAME(COLUMN_NAME) NOSORT ;

調整Checkpoints

一個checkpoint是Oracle自動執行的一種操作,當檢查點操作時,數據庫中的所有緩沖區會寫回磁盤,所有數據庫的控制文件被更新。Checkpoint頻繁發生會加快數據庫的恢復,但是增加了I/O次數,會降低系統的性能。

調整LGWR和DBWn I/O

調整LGWR I/O

每次I/O寫的大小依賴於LOG緩沖區的大小,該大小由LOG BUFFER 所設置,緩沖區太大會延遲寫操作,太小可能導致頻繁的小的I/O操作。如果I/O操作的平均大小很大,那麼LOG文件就會成為瓶頸,可以使用STRIPE REDO LOG文件避免這個問題。

調整DBWN I/O

使用初始參數DB_WRITER_PROCESSES,可以創建多個數據庫寫進程。

調整競爭

由多個進程同時請求使用相同的資源時,就產生了競爭

確定競爭問題

視圖V$RESOURCE_LIMIT提供了一些系統資源的使用限制。

如果系統存在無反應的現象,檢查V$SYSTEM_EVENT,檢查最大平均等待時間的事件;

如果存在過量的緩沖區等待,檢查V$WAITSTAT,確定哪個類型的塊有最多的等待次數和最長的等待時間,再查詢V$SESSION_WAIT得到每個緩沖區的等待時間。

減少回滾段的競爭

通過檢查V$WAITSTAT可以確定回滾段的競爭:

SELECT CLASS,COUNT FROM V$WAITSTAT WHERE CLASS IN 
(‘SYSTEM UODO HEADER’,’SYSTEM UODO BLOCK’,’UODO HEADER’,’UODO BLOCK’) ;

減少調度進程的競爭

檢查調度進程的busy率

SELECT NETWORK”PROTOCOL”, SUM(BUSY)/(SUM(BUSY)+SUM(IDLE)) “TOTAL BUSY RATE” 
FROM V$DISPATCHER GROUP BY NETWORK ;

如果指定協議的調度進程忙的時間超過50%的有效工作時間,那麼,增加調度進程可以提高使用該協議連接到Oracle的性能。

檢查調度進程相應隊列的等待時間

SELECT NETWORK “PROTOCOL” DECODE(SUM(TOTALQ),0.’NO RESPONSES’,
SUM(WAIT)/SUM(TOTALQ)||’HUNDREDTHS OF SECONDS’) “AVERAGE WAIT TIME PER RESPONSE” 
FROM V$QUEUE Q,V$DISPATCHER D WHERE Q.TYPE=’DISPATCHER’ AND Q.PADDR=D.PADDR GROUP BY NETWORK ;

增加調度進程:使用MTS_DISPATCHERS參數和ALTER_SYSTEM命令可以增加調度進程

減少共享服務器進程的競爭

共享服務器進程競爭可以由不斷增加的請求等待時間所反映,使用如下查詢:

select decode(totalq,0,’No Requests’, wait/totalq||’hundredths of seconds’) 
“Average Wait Time Per Requests” from v$queue where type=’COMMON’ ;

使用如下查詢可以得到當前運行的共享服務進程數:

select count(*) “Shared Server Processes” from V$shared_servers where status!=’QUIT’;

Oracle能自動增加共享服務進程,但是MTS_MAX_SERVERS的值可以更改。

  減少redo log緩沖區latches競爭

在LGWR進程將redo入口從redo log緩沖區寫入redo log文件後,該入口就會被新入口覆蓋,供其他log的使用。

V$SYSSTAT中redo buffer allocation retrIEs 反映用戶進程等待redo log空間的次數:

Select name,value from v$sysstat where name=’redo buffer allocation retrIEs’ ;

redo buffer allocation retrIEs的值應該接近0,如果該值持續增加,那麼,說明進程需要等待緩沖區的空間。增大參數LOG_BUFFER的值可以增大redo log的大小。

確定redo log緩沖區latches競爭

redo分配latch;

redo復制latches。

一次只能有一個用戶分配緩沖區中的空間,在分配了redo入口的空間後,用戶進程將入口復制到緩沖區,其最大大小是由LOG_SMALL_ENTRY_MAX_SIZE指定。Redo復制latches的數目由參數LOG_SIMULTANEOUS_COPIES指定。

檢查redo log活動

對redo log緩沖區的頻繁訪問可能導致redo log緩沖區latches競爭,降低系統性能。Oracle在動態表V$LATCH中收集了所有LATCH的統計信息。

其中:表v$latch反映willing-to-wait 請求的列

gets-成功的willing-to-wait請求數;

misses-初始不成功的willing-to-wait請求數;

sleeps-請求不成功的等待時間;

表v$latch反映immediate請求的列:

immediate gets-成功的immediate請求數

immediate misses-不成功的immediate請求數

使用如下查詢:

select ln.name,gets,misses,immediate_gets,immediate_misses from v$latch l,
v$latchname ln where ln.name in (‘redo allocation ’,’redo copy’) and ln.latch#=l.latch# ;

可以計算出各類請求的等待率。

減少latch競爭

要減少redo allocation latch競爭,必須減少單個進程占用latch的時間。要減少這個時間,可以減少該redo allocation latch的復制。減少LOG_SMALL_ENTRY_MAX_SIZE初始參數可以減少在redo allocation latch的redo入口的復制次數和大小。

減少redo copy Latches競爭可以用增加LOG_SIMULTANEOUS_COPIES的值來增加LATCH數,最多可以達到CPU的兩倍。

減少Free List競爭

確定Free List競爭,可以使用以下幾步:

1. 檢查V$WAITSTAT,確定DATA BLOCKS的競爭;

2. 檢查V$SYSTEM_EVENT,確定BUFFER BUSY WAITS,如果數值高,表明存在競爭;

3. 在這種情況下,檢查V$SESSION_WAIT查詢每個緩沖區的忙等待、FILE、BLOCK及ID;

4. 使用如下查詢得到實體和FREE LIST的名稱:

SELECT SEGMENT_NAME,SEGMENT_TYPE FROM DBA_EXTENTS 
WHERE FILE_ID=file AND BLOCK BETWEEN block_id AND block_id+blocks ;

5. 使用如下查詢找到FREE LIST:

SELECT SEGMENT_NAME,FREELISTS FROM DBA_SEGMENTS 
WHERE SEGMENT_NAME=segment AND SEGMENT_TYPE=type ;

增加Free List

要減少表的Free list的競爭, 可以使用freelists參數重新創建表,方法有:

1. 刪除舊表,重新創建表;

2. 通過從舊表選擇數據插入到新表,刪除舊表,重命名,完成表的重新創建;

3. 使用Export 和Import,export舊表,刪除舊表,import該表

建立和優化數據庫文件的方針:

為表和索引創建不同的表空間。

將表和索引的表空間放在不同的磁盤上。

將REDO日志和回滾段放在不同的磁盤上。

將Oracle可執行文件和數據庫文件放在單獨的磁盤上。

確定最常用的表、索引,以及他們的表空間,並放在單獨的磁盤上。

不要在Oracle數據磁盤上安裝其他第三方軟件。

監控磁盤I/O的方法:

用以下查詢語句可以得到各表空間讀寫次數,phyrds+phywrts 即是磁盤I/O量。應按前面講的方針調整數據文件的分布方式。

select name,phyrds,phywrts from v$datafile,
v$filestat where v$datafile.file# = v$filestat.file#

結果如下:

NAME PHYRDS PHYWRTS

-------------------------------------------------- ---------- ----------

/u/Oracle/OraHome/oradata/pb/system01.dbf 2511 8

/u/Oracle/OraHome/oradata/pb/tools01.dbf 5 2

/u/Oracle/OraHome/oradata/pb/rbs01.dbf 18 20

/u/Oracle/OraHome/oradata/pb/temp01.dbf 4 2

/u/Oracle/OraHome/oradata/pb/users01.dbf 45 5

/u/Oracle/OraHome/oradata/pb/indx01.dbf 4 2

/u/Oracle/OraHome/oradata/pb/drsys01.dbf 4 2

7 rows selected.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved