數據庫優化-oracle

系統優化

數據庫管理員通過對系統參數的調整達到優化的目的

調整內存分配

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子句最後部分往前排列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章