系統優化
數據庫管理員通過對系統參數的調整達到優化的目的
調整內存分配
SGA
系統全局區(SGA) 是一個分配給Oracle 包含Oracle 數據庫實例控制信息的內存段。
參數DB-BLOCK-BUFFERS(SGA中存儲區高速緩存的緩衝區數目),參數SHARED-POOL-SIZE(分配給共享SQL區的字節數),是SGA大小的主要影響者。
初始化參數DB-BLOCK-BUFFERS控制數據庫緩衝區高速緩存的大小。可通過查詢V$SYSSTAT命中率,以確定是否 應當增加DB-BLOCK-BUFFERS的值。
SELECT name,value FROM V$SYSSTATWHERE name IN (’dbblock gets’,’consistent gets’,’physical reads’);
通過查詢結果
命中率=1-physical reads/(dbblock gets+consistent gets)
如果命中率<0.6~0.7,則應增大DB-BLOCK-BUFFERS。
SGA 區共享池
SGA區共享池部分由庫高速緩存、字典高速緩存及其他一些用戶和服務器會話信息組成,共享池是最大的消耗成分。調整各個結構的大小,可以極大地提高系統的性能。
Library Cache
庫高速緩存(Library Cache) 中包含私用和共享SQL區和PL/SQL區。調整SGA的重要問題是確保庫高速緩存足夠大,以使Oracle能在共享池中保持分析和執行語 句,提高語查詢 V$LIBRARYCACHE 數據字典視圖句分析和執行效率,降低資源消耗。通過比較Library Cache的命中率來決定它的大小。(其中,pins表示高速緩存命中率,reloads表示高速緩存失敗)
SELECT SUM(pins),SUM(reloads) FROM v$librarycache;
如果sum(reload)/sum(pins)≈0,說明Library Cache的命中率比較合適,若大於1,則需要增加共享池(SHARED-POOL-SIZE)的大小(在初始化參數文件中)。
Dictionary Cache
數據字典高速緩存包括了有關數據庫的結構、用戶、實體信息等。數據字典的命中率對系統有很大的影響。命中率的計算中,getmisses 表示失敗次數,gets表示成功次數。查詢V$ROWCACHE表:
SELECT (1-(SUM(getmisses)/(SUM(gets)+SUM(getmisses))))*100FROM v$rowcache;
如果該值>90%,說明命中率合適。否則,應增大共享池的大小。
調整I/O
磁盤I/O是系統性能的瓶頸,解決好磁盤I/O,可明顯提高性能。通過查詢V$FILESTAT可以知道每個物理文件的使用頻率(phyrds表示每個數據文件讀的次數,phywrts表示每個數據文件寫的次數)
SELECT name,phyrds,phywrts FROM v$datafile df,v$filestat fsWHERE df.file# =fs.file#;
對於使用頻率較高的物理文件,可以採用以下策略:
- 將I/O儘可能平均分配在儘可能多的磁盤上。
- 爲表和索引建立不同的表空間。
- 將數據文件與重做日誌文件分離在不同的磁盤上。
- 減少不經Oracle SERVER的磁盤I/O。
調整競爭
當多個進程對相同的資源發出申請時,產生競爭。
修改Process參數
該參數定義可以同時連接到Oracle數據庫的最大進程數,缺省值爲50。注意,Oracle的後臺進程也包括在此數目中,建議將該值改爲200。
減少調度進程的競爭
減少調度進程的競爭,通過查詢v$dispatcher表來判定調度進程的競爭
SELECT network ,sum(busy)/sum(busy)+sum(idle) FROM v$dispatcherGROUP BY network;
如果某種協議忙的比率超過50%,應增加MTS-DISPATCHERS的值。
減少多線程服務進程競爭
首先查詢V$SYSSTAT表判定是否發生多線程服務進程競爭:
SELECT DECODE(totalq,0,’No request’,wait/totalq||’hunderths of seconds’) FROM v$sysstatWHERE type=’common’;
如果共享服務進程數量已達到初始化參數文件中MTS-MAX-SERVERS指定的最大值,但應用運行時,平均請求等待時間仍持續增長,那麼,應加大MTS-MAX-SERVERS的值。
減少重做日誌緩衝區競爭
通過查詢V$SYSSTAT表判定redo log 文件緩衝區是否足夠。
SELECT name,value FROM v$sysstatWHERE name=’redo log space request’;
此處value的值應接近於0,否則,應增大初始化參數文件的LOG-BUFFEQS的值。
減少回退段競爭
回退段對性能也有影響,根據事物大小情況來分配合適的回退段。
首先判定回退段的數量能否滿足系統運行的需要:
查詢V$WAITSTAT表與V$SYSSTAT表
SELECT class,count FROM v$waitstatWHERE class IN (’system undo header’,system undo block’,’undo header’,’undo block’);SQL>SELECT sum(value)FROM v$sysstat WHERE name IN (’db block gets’,’consistent gets’);
如果任何一個class/sum(value)>10%,那麼考慮增加回退段。
減少Free List競爭
當多個進程同時向一個表中插入數據時,產生Free List競爭。
SELECT class,count FROM v$waitstatWHERE class=’free list’;SQL>SELECT sum(value)FROM v$sysstatWHERE name IN (’db block gets’,’consistent gets’);
如果class/sum(value)>1%,則應增加該表的Free List 的值。
應用程序優化
開發人員對應用程序優化
SQL 優化
- 不要用*代替所有列名
- 使用TRUNCATE代替DELETE
Oralce執行DELETE後會使用UNDO表空間存放被刪除的信息以便恢復,如果之後用戶使用ROLLBACK而不是COMMIT,則 Oralce將利用該UNDO表空間中的數據進行恢復。當使用TRUNCATE時,Oracle不會將刪除的數據放入UNDO表空間,因而速度要快很多。 當要刪除某個表中的全部數據時,應該使用TRUNCATE而不是不帶WHERE條件的DELETE。 - 活用COMMIT
PL/SQL塊中,經常將幾個相互聯繫的DML語句寫在BEGIN …END,如果不影響事務的完整性,則建議在每個END前面寫一個COMMIT,以達到 對DML的及時提交和 釋放事務所佔的資源的目的。
以EXISTS代替DISTINCT
多表信息的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXISTS替換, EXISTS 使查詢更爲迅速,因爲此時RDBMS核心模塊將在子查詢的條件一旦滿足後,立刻返回結果。 - 使用默認值
在不含默認值,是null的列上沒有使用索引,是全表掃描!而使用了默認值的列上使用了索引範圍掃描! - 使用DECODE函數減少處理步驟
用DECODE函數可以避免重複掃描相同記錄或重複連接相同的表.
lDECODE函數也可以運用於GROUP BY 和ORDER BY子句中. - 通配符
當通配符出現在LIKE後面字符串的首位時,索引將不會被使用,因此在已知某字符的情況下,LIKE查詢中應儘量不要把通配符寫在首位 - FROM表順序選擇
使用基於規則的優化器(CBO)時,Oracle解析器按照從右到左的順序處理FROM子句的表明,即FROM子句中最後的表(驅動表)會最先被處理。
當FROM子句包含多個表時,建議將記錄最少的表(一般是字典表)放在最後面。 - WHERE子句如何寫
使用表的別名、 對錶的連接永遠 寫在WHERE後面的第一個位置,並對過濾條件進行估算, 按照降序的大小將這些 條件從WHERE子句最後部分往前排列。