文章詳情頁
關(guān)于Oracle服務(wù)器性能全面調(diào)整攻略
瀏覽:15日期:2023-11-13 10:08:49
Oracle服務(wù)器是高度可調(diào)的數(shù)據(jù)庫系統(tǒng),它提供了許多特性,正確地設(shè)置和調(diào)整可以有效提高系統(tǒng)性能,因此,對系統(tǒng)進行調(diào)整是數(shù)據(jù)庫治理員的主要責(zé)任。由于應(yīng)用設(shè)計人員很少或根本不會給數(shù)據(jù)庫治理人員提供必要的信息,因此只能采用對已有應(yīng)用系統(tǒng)影響最小的調(diào)整方式:重新分配內(nèi)存、調(diào)整磁盤I/O來提高性能。 調(diào)整內(nèi)存 Oracle服務(wù)器將信息存儲在兩個地方:內(nèi)存、磁盤。因為內(nèi)存的存取比磁盤的存取快得多,為了獲得最佳的性能,總是希望將數(shù)據(jù)盡可能多地放在內(nèi)存供用戶讀取??墒窍到y(tǒng)內(nèi)存資源是有限的,不可能將所有數(shù)據(jù)放在內(nèi)存,因此,要在現(xiàn)有內(nèi)存資源的基礎(chǔ)上,通過調(diào)整內(nèi)存分配來獲得盡可能好的性能。調(diào)整內(nèi)存的分配,實際上就是對Oracle數(shù)據(jù)庫內(nèi)存結(jié)構(gòu)分配恰當(dāng)尺寸的可用內(nèi)存。 為了取得好的效果,調(diào)整要按如下順序進行:調(diào)整操作系統(tǒng)、調(diào)整共享池、調(diào)整緩沖區(qū)高速緩存。由于后面調(diào)整所作的改變可能需要對前面的調(diào)整再次進行判定和調(diào)整,因此,調(diào)整的過程可能需要若干次循環(huán)。 調(diào)整操作系統(tǒng) 操作系統(tǒng)運行得好,是Oracle調(diào)整內(nèi)存分配的基礎(chǔ),其方法如下: 減少調(diào)頁或交換 過度的調(diào)頁或交換必定會降低操作系統(tǒng)的性能??梢杂貌僮飨到y(tǒng)提供的實用程序進行監(jiān)控,如發(fā)現(xiàn)有過度的調(diào)頁或交換,則說明系統(tǒng)總內(nèi)存存放不下已經(jīng)分配在內(nèi)存中的信息。解決的辦法是增加系統(tǒng)內(nèi)存總量,或減少已經(jīng)分配的內(nèi)存量。 調(diào)整系統(tǒng)全局區(qū)(SGA) SGA是Oracle數(shù)據(jù)庫存放系統(tǒng)信息的一塊區(qū)域,由所有的服務(wù)器和客戶進程共享,主要由以下四部分組成:數(shù)據(jù)高速緩沖區(qū)、字典緩沖區(qū)、重演日志緩沖區(qū)、共享SQL池。建SGA的目的是為了將數(shù)據(jù)放在內(nèi)存以便快速存取,假如SGA過大內(nèi)存放不下,就要被交換到磁盤,產(chǎn)生過度交換或調(diào)頁,數(shù)據(jù)存取就快不了。在大多數(shù)系統(tǒng)里,過度調(diào)頁的壞處比大SGA的好處對性能的影響要大得多,因此寧可SGA小些,也要保證整個SGA能被內(nèi)存容下。 可利用SQL*DBA語句SHOW SGA來查看分配了多少內(nèi)以及每個內(nèi)部結(jié)構(gòu)的大小。
該機系統(tǒng)內(nèi)存256M,SGA大小約為115M,應(yīng)用過程中不會發(fā)生調(diào)頁或交換。為了提高性能,還可以在初始化參數(shù)文件INIT.ORA中添加參數(shù) PRE_PAGE_SGA=FALSE,使得Oracle在啟動Instance時將整個SGA讀入內(nèi)存。該設(shè)置雖然會增加Instance啟動時間,但會減少Oracle在啟動后達到性能峰值所用的時間。 調(diào)整共享池 調(diào)整共享池主要包括三個方面:庫高速、數(shù)據(jù)字典緩存、對話信息。由于Oracle治理共享池中數(shù)據(jù)的算法,使得數(shù)據(jù)字典緩存中的數(shù)據(jù)比庫高速緩存中的數(shù)據(jù)在內(nèi)存中存留的時間長,因此,只要把庫高速緩存調(diào)整成可以接受的命中率,就能提高數(shù)據(jù)字典緩存的命中率。 檢查、調(diào)整庫高速緩存 可以通過動態(tài)性能表V$LIBRARYCACHE來查詢Instance啟動以來所有庫高速緩存的活動。 V$LIBRARYCACHE表中以下幾列反映了庫高速緩存在執(zhí)行調(diào)用階段的不命中: PINS列,它的值顯示在庫高速緩存中執(zhí)行的次數(shù); RELOADS列,它的值顯示在執(zhí)行階段庫高速緩存不命中的數(shù)目。
一般來說,庫高速緩存總不命中數(shù)與總存取數(shù)之比應(yīng)當(dāng)接近零,本例為0.001%,說明庫高速緩存命中率很高,該比率假如接近或大于1%,就應(yīng)當(dāng)立即采取措施來減少這種不命中。 措施一:增加初始化參數(shù)shared_pool_size的值,提高庫高速緩存可用的內(nèi)存數(shù)量,同時為了取得好的效果,可能還要增加初始化參數(shù)open_cursors的值,以提高對話答應(yīng)的光標(biāo)數(shù)。需要注重的是:為庫高速緩存分配了太多的內(nèi)存可能引起調(diào)頁或交換。 措施二:寫等價的SQL語句,盡可能讓SQL語句和PL/SQL塊共享一個SQL區(qū),來減少庫高速緩存的不命中。這是應(yīng)用設(shè)計人員應(yīng)該做到的:SQL語句或PL/SQL塊的文本必須每一個字符都等價,包括大小寫和空格。 檢查、調(diào)整數(shù)據(jù)字典高速緩存 在應(yīng)用已經(jīng)運行,數(shù)據(jù)庫達到了一種相對“穩(wěn)定的狀態(tài)”之后,可以通過動態(tài)性能表V$ROWCACHE來查詢數(shù)據(jù)字典高速緩存的活動。 V$ROWCACHE表中以下幾列反映了數(shù)據(jù)字典高速緩存的使用和有效性: GETS列,它的值顯示請求相應(yīng)項的總數(shù)。 GETMISSES列,它的值顯示造成高速緩存不命中的數(shù)據(jù)請求數(shù)。
一般來說,數(shù)據(jù)字典高速緩存總不命中數(shù)與總存取數(shù)之比應(yīng)當(dāng)接近零,本例為1.616%,說明數(shù)據(jù)字典高速緩存命中率比較高,該比率假如大于10%,甚至在應(yīng)用過程中該比率還在增長時,就應(yīng)當(dāng)立即通過增加初始化參數(shù)shared_pool_size的值,來提高數(shù)據(jù)字典高速緩存可用的內(nèi)存數(shù)量,從而減少這種不命中。 檢查、調(diào)整對話信息占用共享池的大小 多線程服務(wù)器答應(yīng)進程共享內(nèi)存和連接,能支持大量用戶同時訪問數(shù)據(jù)庫。使用多線程服務(wù)器結(jié)構(gòu)時,需要將共享池分得大一些以容納對話信息。可以通過動態(tài)性能表V$SESSTAT來查詢Oracle收集對話信息使用的總內(nèi)存統(tǒng)計。 V$SESSTAT表中session memory列,顯示分配給對話的內(nèi)存字節(jié)數(shù)。 max session memory列,顯示分配給對話的最大內(nèi)存數(shù)。
第二個結(jié)果比第一個結(jié)果大,但第一個結(jié)果能更好地估計共享內(nèi)存應(yīng)該多大,除非所有對話幾乎在同一時間都達到最大分配。假如共享池不夠,可以通過增加初始化參數(shù)shares_pool_size的值來增加。本例中共享池的大小為52428800,容納對話信息綽綽有余。調(diào)整緩沖區(qū)高速緩存 Oracle啟動后不斷收集和統(tǒng)計數(shù)據(jù)存取的情況,并將其存放在動態(tài)性能表V$SYSSTAT中。表中對調(diào)整緩沖區(qū)高速緩存有用的為以下幾項統(tǒng)計: dbblock gets 該統(tǒng)計值為數(shù)據(jù)請求的總數(shù); consistent gets 該統(tǒng)計值為通過對內(nèi)存緩沖區(qū)存取即能滿足的請求數(shù); physical reads 該統(tǒng)計值為磁盤文件存取的總數(shù)。 下面語句可以監(jiān)控在一段時間內(nèi)V$SYSSTAT表中的統(tǒng)計:
用以下公式計算緩沖區(qū)高速緩存的命中率 :命中率=1-( physical reads /(db block gets+ consistent gets))。根據(jù)以上查詢出的統(tǒng)計數(shù)據(jù),計算出緩沖區(qū)高速緩存的存取命中率為99.198%。
該例中,命中率很高,說明緩沖區(qū)高速緩存夠用,性能良好。假如高速緩存大到足以容納最經(jīng)常存取的數(shù)據(jù),在保持高命中率的前提下,可以通過適當(dāng)減少初始化參數(shù)db_block_buffers的值來減少高速緩存的大小,從而可將省出來的內(nèi)存用于其他Oracle內(nèi)存結(jié)構(gòu)。假如命中率低于70%的話,性能就會造成下降,就應(yīng)該立即通過增加初始化參數(shù)db_block_buffers的值(它的最大值為65535),來擴大緩沖區(qū)高速緩存的大小。 重新分配內(nèi)存 經(jīng)過上述對Oracle內(nèi)存結(jié)構(gòu)分配的調(diào)整,可以再次對庫高速緩存、數(shù)據(jù)字典高速緩存和緩沖區(qū)高速緩存的性能作出評估。假如有可能減少某種結(jié)構(gòu)的內(nèi)存消耗,就可以考慮給其他結(jié)構(gòu)多分配一些內(nèi)存,以得到增加可用內(nèi)存的好處。但要注重,經(jīng)過調(diào)整后的Oracle內(nèi)存結(jié)構(gòu),假如使SGA過大而不能全部填入主存,就可能會使操作系統(tǒng)引起過度調(diào)頁或分配,從而降低性能。 在重新分配內(nèi)存的過程中,假如發(fā)現(xiàn)要取得Oacle最佳內(nèi)存結(jié)構(gòu)十分困難,就需要考慮花費資金,通過在計算機中增加更多的內(nèi)存來進一步改進性能。
該機系統(tǒng)內(nèi)存256M,SGA大小約為115M,應(yīng)用過程中不會發(fā)生調(diào)頁或交換。為了提高性能,還可以在初始化參數(shù)文件INIT.ORA中添加參數(shù) PRE_PAGE_SGA=FALSE,使得Oracle在啟動Instance時將整個SGA讀入內(nèi)存。該設(shè)置雖然會增加Instance啟動時間,但會減少Oracle在啟動后達到性能峰值所用的時間。 調(diào)整共享池 調(diào)整共享池主要包括三個方面:庫高速、數(shù)據(jù)字典緩存、對話信息。由于Oracle治理共享池中數(shù)據(jù)的算法,使得數(shù)據(jù)字典緩存中的數(shù)據(jù)比庫高速緩存中的數(shù)據(jù)在內(nèi)存中存留的時間長,因此,只要把庫高速緩存調(diào)整成可以接受的命中率,就能提高數(shù)據(jù)字典緩存的命中率。 檢查、調(diào)整庫高速緩存 可以通過動態(tài)性能表V$LIBRARYCACHE來查詢Instance啟動以來所有庫高速緩存的活動。 V$LIBRARYCACHE表中以下幾列反映了庫高速緩存在執(zhí)行調(diào)用階段的不命中: PINS列,它的值顯示在庫高速緩存中執(zhí)行的次數(shù); RELOADS列,它的值顯示在執(zhí)行階段庫高速緩存不命中的數(shù)目。
一般來說,庫高速緩存總不命中數(shù)與總存取數(shù)之比應(yīng)當(dāng)接近零,本例為0.001%,說明庫高速緩存命中率很高,該比率假如接近或大于1%,就應(yīng)當(dāng)立即采取措施來減少這種不命中。 措施一:增加初始化參數(shù)shared_pool_size的值,提高庫高速緩存可用的內(nèi)存數(shù)量,同時為了取得好的效果,可能還要增加初始化參數(shù)open_cursors的值,以提高對話答應(yīng)的光標(biāo)數(shù)。需要注重的是:為庫高速緩存分配了太多的內(nèi)存可能引起調(diào)頁或交換。 措施二:寫等價的SQL語句,盡可能讓SQL語句和PL/SQL塊共享一個SQL區(qū),來減少庫高速緩存的不命中。這是應(yīng)用設(shè)計人員應(yīng)該做到的:SQL語句或PL/SQL塊的文本必須每一個字符都等價,包括大小寫和空格。 檢查、調(diào)整數(shù)據(jù)字典高速緩存 在應(yīng)用已經(jīng)運行,數(shù)據(jù)庫達到了一種相對“穩(wěn)定的狀態(tài)”之后,可以通過動態(tài)性能表V$ROWCACHE來查詢數(shù)據(jù)字典高速緩存的活動。 V$ROWCACHE表中以下幾列反映了數(shù)據(jù)字典高速緩存的使用和有效性: GETS列,它的值顯示請求相應(yīng)項的總數(shù)。 GETMISSES列,它的值顯示造成高速緩存不命中的數(shù)據(jù)請求數(shù)。
一般來說,數(shù)據(jù)字典高速緩存總不命中數(shù)與總存取數(shù)之比應(yīng)當(dāng)接近零,本例為1.616%,說明數(shù)據(jù)字典高速緩存命中率比較高,該比率假如大于10%,甚至在應(yīng)用過程中該比率還在增長時,就應(yīng)當(dāng)立即通過增加初始化參數(shù)shared_pool_size的值,來提高數(shù)據(jù)字典高速緩存可用的內(nèi)存數(shù)量,從而減少這種不命中。 檢查、調(diào)整對話信息占用共享池的大小 多線程服務(wù)器答應(yīng)進程共享內(nèi)存和連接,能支持大量用戶同時訪問數(shù)據(jù)庫。使用多線程服務(wù)器結(jié)構(gòu)時,需要將共享池分得大一些以容納對話信息。可以通過動態(tài)性能表V$SESSTAT來查詢Oracle收集對話信息使用的總內(nèi)存統(tǒng)計。 V$SESSTAT表中session memory列,顯示分配給對話的內(nèi)存字節(jié)數(shù)。 max session memory列,顯示分配給對話的最大內(nèi)存數(shù)。
第二個結(jié)果比第一個結(jié)果大,但第一個結(jié)果能更好地估計共享內(nèi)存應(yīng)該多大,除非所有對話幾乎在同一時間都達到最大分配。假如共享池不夠,可以通過增加初始化參數(shù)shares_pool_size的值來增加。本例中共享池的大小為52428800,容納對話信息綽綽有余。調(diào)整緩沖區(qū)高速緩存 Oracle啟動后不斷收集和統(tǒng)計數(shù)據(jù)存取的情況,并將其存放在動態(tài)性能表V$SYSSTAT中。表中對調(diào)整緩沖區(qū)高速緩存有用的為以下幾項統(tǒng)計: dbblock gets 該統(tǒng)計值為數(shù)據(jù)請求的總數(shù); consistent gets 該統(tǒng)計值為通過對內(nèi)存緩沖區(qū)存取即能滿足的請求數(shù); physical reads 該統(tǒng)計值為磁盤文件存取的總數(shù)。 下面語句可以監(jiān)控在一段時間內(nèi)V$SYSSTAT表中的統(tǒng)計:
用以下公式計算緩沖區(qū)高速緩存的命中率 :命中率=1-( physical reads /(db block gets+ consistent gets))。根據(jù)以上查詢出的統(tǒng)計數(shù)據(jù),計算出緩沖區(qū)高速緩存的存取命中率為99.198%。
該例中,命中率很高,說明緩沖區(qū)高速緩存夠用,性能良好。假如高速緩存大到足以容納最經(jīng)常存取的數(shù)據(jù),在保持高命中率的前提下,可以通過適當(dāng)減少初始化參數(shù)db_block_buffers的值來減少高速緩存的大小,從而可將省出來的內(nèi)存用于其他Oracle內(nèi)存結(jié)構(gòu)。假如命中率低于70%的話,性能就會造成下降,就應(yīng)該立即通過增加初始化參數(shù)db_block_buffers的值(它的最大值為65535),來擴大緩沖區(qū)高速緩存的大小。 重新分配內(nèi)存 經(jīng)過上述對Oracle內(nèi)存結(jié)構(gòu)分配的調(diào)整,可以再次對庫高速緩存、數(shù)據(jù)字典高速緩存和緩沖區(qū)高速緩存的性能作出評估。假如有可能減少某種結(jié)構(gòu)的內(nèi)存消耗,就可以考慮給其他結(jié)構(gòu)多分配一些內(nèi)存,以得到增加可用內(nèi)存的好處。但要注重,經(jīng)過調(diào)整后的Oracle內(nèi)存結(jié)構(gòu),假如使SGA過大而不能全部填入主存,就可能會使操作系統(tǒng)引起過度調(diào)頁或分配,從而降低性能。 在重新分配內(nèi)存的過程中,假如發(fā)現(xiàn)要取得Oacle最佳內(nèi)存結(jié)構(gòu)十分困難,就需要考慮花費資金,通過在計算機中增加更多的內(nèi)存來進一步改進性能。 標(biāo)簽:
Oracle
數(shù)據(jù)庫
排行榜

網(wǎng)公網(wǎng)安備