oracle效能調整筆記[zt]
ref: http://www.itpub.net/422928.html
[@more@]第二章 調整的資訊來源 Alert Log 檔案中記錄的與效能有關的資訊: |
第三章SQL 調整 1.SQL效能測量工具 TKPROF 全名為Trace Kernel Profile,用來格式化跟蹤檔案,是一個命令列工具,基本的格式如下: tkprof tracefile outputfile … 可選引數及說明如下: Option Description EXPLAIN 為每個SQL語句產生執行計劃,指定使用者方案和密碼,使用其中的PLAN_TABLE表 TABLE 當EXPLAIN選項生效時可用,指定替代PLAN_TABLE的表 SYS 啟用該選項時不包含遞迴呼叫 SORT 指定SQL語句的排序方式 RECORD 指定檔名,將SQL語句寫入,排除遞迴的SQL PRINT 限定只輸出指定數量的分析SQL語句 INSERT 指定一個檔名,容納相關的插入SQL語句,將分析的SQL及統計插入TKPROF_TABLE AGGREGATE 指定多使用者共用的SQL語句統計方式 WAITS 指定是否統計跟蹤檔案中的等待事件 SORT選項可分三類,解析選項,執行選項和取資料選項(PRS,EXE,FCH),根椐這三種操作佔用相關資源來排序。 TKPROF針對SQL的統計也分為三類:解析,執行,取數,具體的統計選項見下表: 統計名稱 統計描述 Count Parse,Execute,Fetch發生的次數 CPU 佔用CPU秒 Elapsed 經過秒 Disk 從磁碟讀取的資料塊數 Query 從SGA中讀取的回滾段塊數 Current 從SGA中讀取的一致性資料塊數 Rows 執行INSERT,UPDATE,DELETE影響的行數或者FETCH返回的行數 從TKPROF的統計結果觀察,發現下列特徵的SQL可能需要調優: 1. 消耗過度的CPU資源; 2. 花費太長的時間在Parse,Execute,Fetch階斷; 3. 從磁碟讀資料塊太多而從SGA中讀塊很少; 4. 存取太多的資料塊(從SGA或者磁碟)而返回的行數很少; TOP SQL 這個工具從Enterprise Manager Console中啟動,有與TKPROF類似的統計,用於確定需要調整的SQL語句。 EXPLAIN PLAN 用EXPLAIN PLAN FOR sql語句產生執行計劃,然後再從PLAN_TABLE中查詢; 執行計劃中各步驟的執行順序遵照如下原則: 1. 從上到下; 2. 從右到左(或者說,從縮排最多的到縮排最少的); 3. 索引操作不參與上面的規則,索引從屬於表操作,先於表操作。 執行計劃的詳盡解釋超出本書範圍,需要參考其它資料; AUTOTRACE AUTOTRACE綜合了TKPROF和EXPLAIN PLAN FOR的功能; 配置AUTOTRACE包括以下步驟: 1. 保證需要AUTOTRACE功能的使用者下有PLAN_TABLE或者有該表的全域性同義詞和那個基表的存取許可權; 2. 建立PLUSTRACE角色,並將該角色許可權賦給相應的使用者,或者相應會話有這個角色對應的許可權; 3. 相關指令碼:%ORACLE_HOME%rdbmsadminutlxplan.sql,%ORACLE_HOME%sqlplusadminplustrce.sql AUTOTRACE的特點: 1. 只能在SQL*Plus的會話中執行; 2. 產生執行計劃前會實際執行SQL,這點與EXPLAIN PLAN FOR不同; 3. 在發出SQL之前,需執行SET AUTOTRACE ON語句。 SET AUTOTRACE語句各選項的意義: 選項 描述 ON 顯示查詢結果,執行計劃,統計 ON STATISTICS 顯示查詢結果,統計 ON EXPLAIN 顯示查詢結果,執行計劃 TRACEONLY 顯示執行計劃,統計 TRACEONLY STATISTICS 顯示統計 OFF 關掉AUTOTRACE STATSPACK STATSPACK中也包含幾種方法排序的SQL,通常只顯示排序值大於一定閥值的SQL,這些閥值可能改變: SQL型別 說明 SQL ordered by Gets 根椐邏輯I/O來排序 SQL ordered by Reads 根椐物理I/O來排序 SQL ordered by Executions 根椐執行次數來排序 SQL (Executions) ordered by Parse Calls 根椐分析次數來排序 第三章SQL 調整 2. 理解ORACLE最佳化器 · 最佳化器的職責是從多行種執行路徑中選擇一種最優的執行路徑; 第三章SQL 調整 3. 穩定執行計劃 改善應用程式效能 第三章SQL 調整 4. 物化檢視 · 物化檢視用資料段儲存預連線,預彙總的查詢資料,物化檢視可以有索引,也可以分割槽,物化檢視主要應用於資料倉儲和決策支援系統; 第三章 SQL 調整 5.索引 索引 第三章 SQL 調整 6.分割槽 · 分割槽表是將大表的資料分成稱為分割槽的許多小的子集,9i提供四種分割槽方法:範圍分割槽,列表分割槽,雜湊分割槽和混合分割槽; 第三章 SQL 調整 7.簇 · 簇是一個或多個表的組合,這些表的資料儲存在相同的資料塊中,當透過簇鍵查詢這些表時,只需讀一個資料塊就能返回連線的多個表的資料; |
第四章 調整共享池 1.理解共享池 理解共享池 |
測量共享池的效能
· 共享池的效能主要用庫快取命中率和資料字典快取命中率來測量,前者更重要,Oracle建議在未調整好庫快取之前,不必費力去調整資料字典快取。
測量庫快取的效能
· 庫快取的效能指標來自V$LIBRARYCACHE檢視,這個檢視的主要欄位描述如下:
欄位名 描述 可接受值(OLTP)
NAMESPACE 主要的型別有SQL AREA (SQL語句), TABLE/PROCEDURE (儲存過程或函式), BODY (包體), TRIGGER (觸發器)
GETS 解析次數
GETHITS 解析時發現語句的解析版本已存在於庫快取中(解析命中)的次數
GETHITRATIO 解析命中率 大於90%
PINS 執行次數
PINHITS 執行命中次數
PINHITRATIO 執行命中率 大於90%
RELOADS 重新解析的次數,重新解析的原因是已快取的解析版本老化或失效 sum(reloads)/sum(pins) < 1%
INVALIDATIONS 語句快取失效的次數,失效的原因是依賴物件被修改刪除或者編譯
· STATSPACK中存放關於庫快取效能的資料有兩個地方:
? Instance Efficiency Percentages (Target 100%)(例項命中率) – Library Hit %;
? Library Cache Activity for DB(庫快取活動)。
測量資料字典快取的效能
· 資料字典快取效能指標來自V$ROWCACHE檢視,用下面的查詢來獲得命中率:
select 1 – (sum(getmisses) / sum(gets)) from v$rowcache;可以接受的命中率是85%以上;
· STATSPACK中關於資料字典快取效能的資料存放在Dictionary Cache Stats for DB(資料字典快取統計)。
3.改進共享池的效能
改進共享池的效能
改進共享池的效能就是提高庫快取和資料字典快取的命中率,有以下一些方法:
增大共享池
· 增大共享池能減慢庫快取和資料字典快取被LRU演算法移出的速度,從而提高命中率;
· 庫快取命中率和資料字典快取命中率通常都趨向於一致,極少出現一高一低的情形;
· 共享池的大小由初始化引數SHARED_POOL_SIZE來確定;
· 已使用庫快取的大小可以透過sum(V$DB_OBJECT_CACHE.SHARABLE_MEM)(非SQL物件)和 sum(V$SQLAREA.SHARABLE_MEM)(SQL語句) 來查詢;
· 可以用ALTER SYSTEM SET SHARED_POOL_SIZE = XX; 來動態更改共享池的大小,但需保證更改後SGA的大小不大於SGA_MAX_SIZE,否則會現ORA-04033的錯誤;
· 也可以透過關機更改初始引數SHARED_POOL_SIZE再重啟來手工更改共享池的大小,這種方法適於同時改大SGA_MAX_SIZE這個引數;
· 無統計資料時,可以按照下面的策略來為ORACLE伺服器分配記憶體:
? 作業系統(NT需要的較UNIX多),ORACLE後臺程式,伺服器程式,其它非ORACLE程式共需記憶體= 伺服器總記憶體 * 45%(1G以下時) or 25~40%(1G以上時);
? TSGA(SGA總記憶體) = 伺服器總記憶體 * 55%(1G以下時) or 60~75%(1G以上時);
? TSGAI(單個例項的SGA記憶體) = TSGA / 伺服器上的例項數;
? 共享池 = TSGAI * 45%;
? 資料快取 = TSGAI * 45%;
? 日誌快取 = TSGAI * 10% (10%的日誌快取通常都偏大,可待有統計資料後視情形將多出的部分分給共享池,資料快取或者大池);
? 若需配置大池和JAVA池時,從本例項SGA總記憶體中分配。
為大的PL/SQL語句留空間;
· 執行大的PL/SQL程式時,為了獲得足夠的快取空間,LRU演算法會移出許多已解析的語句,爾後這些剛被移出的語句可能又要重新裝入,這樣就降低的庫快取的命中率,為了避免這樣的情形,可以設定共享池保留區給大的PL/SQL物件使用;
· 引數SHARED_POOL_RESERVED_SIZE用來指定共享池保留區的大小,最大可指定到共享池的一半,預設值是共享池的5%,ORACLE建議從共享池的10%開始調整;
· 可以從V$DB_OBJECT_CACHE查到目前快取物件及其使用空間(OWNER, NAME, SHARABLE_MEM);
· 可以用V$SHARED_POOL_RESERVED檢視來監控保留區的使用情況以決定正確的保留區大小:
? REQUESTS 從保留區中請求空間的次數;
? REQUEST_MISSES 保留區無空間可用而需要從非保留區清洗物件的請求次數;這個值為零或者一直很穩定表示保留區空間設定偏大;
? FREE_SPACE 保留區未用的空間;這個空間大於保留區的一半時表示保留區空間設定偏大;
? REQUEST_FAILURES 請求無法滿足,出現ORA-04031錯誤的次數; 這個值非零或者穩定增加時表示保留區太小;
? 隱含引數_shared_pool_reserve_min_alloc(4400)確定請求保留區的起始大小;
? 調整保留區的目標是使REQUEST_MISSES, REQUEST_FAILURES接近零。
· 可以用DBMS_SHARED_POOL.ABORT_REQUEST_THRESHOLD這個包過程設定一個閥值,大於這個值的庫快取請求將會失敗。
Keep PL/SQL
· 將重用率高的PL/SQL程式碼KEEP在庫快取中可以提高命中率,這個過程又稱Pinning,由DBMS_SHARED_POOL.KEEP過程來完成,這些物件存放在共享池保留區中;
· 清洗共享池語句(ALTER SYSTEM FLUSH SHARED_POOL;)並不會清洗Pinned物件,但是系統重啟後,這些物件將不再是Pinned。
· Keep相關:
? DBMS_SHARED_POOL這個包並沒有在執行catproc.sql時安裝,需執行一次dbmspool.sql這個指令碼;
? 可以用這個包中的KEEP, UNKEEP來pin 和unpin儲存物件;
? 可從V$DB_OBJECT_CACHE.KEEP這個欄位得知哪些物件已被Pinned。
· 要確定哪些物件適於KEEP,可以啟用審計功能來檢視是哪些物件被頻繁地呼叫,要KEEP匿名的PL/SQL程式比較麻煩,建議將經常使用且長度超過500個字元的匿名塊寫成過程和包再進行KEEP;
· 因為重啟後所有的KEEP都將失效,所以將KEEP的動作放在系統觸發器中(AFTER STARTUP ON DATABASE)是較合適的。
程式碼重用;
· 確定是否需要對語句進行(硬)解析時,是先比較語句的雜湊值,下面的兩種方法有助於獲得相同的雜湊值,從而可以實現重用程式碼,提高命中率:
? 開發組的所有成員都使用相同的編碼規範(包括大小寫,空格,換行等);
? 使用繫結變數(提高命中率的同時可能會產生不夠好的執行計劃,因為最佳化器不知道變數的確定值,在有欄位的柱狀圖統計資料時也不能夠利用)。
調整相關初始化引數。
OPEN_CURSORS
· 這個引數指定每個使用者會話能開啟的遊標個數;
· 增大這個值可以減少重新解析會話曾開啟的語句的機會,提高命中率,但需要更大的共享池空間。
CURSOR_SPACE_FOR_TIME
· 這個引數設為真時,只有當所有引用共享SQL的遊標都關閉後,LRU才有可能移出這個SQL所佔的快取空間來重用,預設值是FALSE;
· 只有在共享池足夠大的情況下才能考慮設為真,設為真時可以減少重解析,提高命中率,加快遊標的執行(空間換時間)。
SESSION_CACHED_CURSORS
· 這個引數指定會話能夠快取遊標的個數,預設值是零;
· 如果會話反覆執行某些語句,設定該值大於零能提高遊標的執行速度,這些快取也是用LRU演算法來管理的。
CURSOR_SHARING
· 這個引數決定什麼樣的SQL語句能夠共享遊標,有三個取值:FORCE, SIMILAR, EXACT;
? FORCE 兩個語句的差異只在字面值,這些差異不會改變語句的含義時可共享遊標;
? SIMILAR兩個語句的差異只在字面值,這些差異不會改變語句的含義和執行計劃時可共享遊標(這個值是在9i 中引入,如果有差異的欄位上有柱狀圖統計,這時執行計劃會改變,不能共享遊標,行為同於EXACT,如果差異欄位上沒有柱狀圖統計,執行計劃相同,這時的行為同於FORCE);
? EXACT 兩個語句必須精確匹配才能共享遊標,這是預設值。
第五章 調整資料快取 1.理解資料快取
理解資料快取
· 資料快取是SGA的一部分,用於存放使用者最近存取過的段的資料塊的副本,這些段可能是資料段,索引段,簇段,LOB段,LOB索引段,回滾段,臨時段,資料快取單元的大小與資料庫塊大小一致。
· 資料快取用下面的方法進行管理:
LRU列表
· 在Oracle執行SQL語句的過程中,相關的段資料要複製到SGA的資料快取中來,這個操作由使用者的伺服器程式來執行;
· 與共享池類似,資料快取也是由LRU演算法來管理的,當資料快取的快取塊被填滿而又有新的快取塊請求時,LRU將最近最少使用的快取塊老化出去,而保留最近經常使用的快取塊,當一個使用者發現要讀取的資料塊已在之前由其它使用者讀入時,就可以節約很多時間,因為從記憶體中讀取比從磁碟中讀取要快上數千倍;
· LRU演算法管理一個LRU列表,這個列表類似於一個輸送帶,伺服器程式將剛剛存取過的資料塊放在輸送帶的開始端,隨著更多的塊被讀入,先前讀入的塊向輸送帶末端移動,如果在到達末端之前某個塊被再一次存取,則這個塊又被移到開始端,否則就會從輸送帶末端跌落(快取塊被老化);
· LRU對全表掃描時讀入快取塊的管理與上面的有些不同,這些塊一讀入就被放在LRU列表的末端,這樣可以避免對大表全表掃描時把資料快取中的所有快取塊都清洗出去;
· LRU演算法管理下的快取塊有四種狀態:
? Free 自資料庫啟動以來尚未被使用過的快取塊;
? Pinned 正在被伺服器程式使用的快取塊;
? Clean 曾被使用過且可立即被重用的快取塊,讀入後未經修改或者最近一次修改已被寫回磁碟,快取版本與檔案資料塊一致;
? Dirty 曾被使用過且不能立即被重用的快取塊,讀入後作過修改且最近一次修改未被寫回磁碟,快取版本與檔案資料塊不一致;
· 管理髒塊時會用到一個髒塊列表(Dirty List,又名寫列表),這個列表被檢查點佇列使用,用於跟蹤所有的髒塊,以第一次修改時間排序,髒塊由DBW0程式寫回磁碟。
使用者伺服器程式
· 當需要讀取某個資料塊時,伺服器程式先到資料快取中檢視該塊是否已存在,若沒有找到,就需要將資料塊從資料檔案讀到資料快取中來,這首先要在資料快取中找到一個可用的快取塊來容納資料塊的副本,這個過程中伺服器程式可能要和LRU列表以及髒列表打交道:
? 在LRU列表上查詢可用塊的時候,伺服器程式將查到的髒塊從LRU列表移到髒列表;
? 隨著髒塊的加入,髒列表不斷變長,當長度超過某個預定義的長度時,觸發DBW0將髒列表上的髒塊寫回磁碟;
? 如果伺服器程式在LRU列表查詢很多的塊(超過某個閥值)都沒能找到可用的塊時,觸發DBW0程式,將髒塊直接從LRU列表寫回磁碟。
· 如果伺服器程式發現要找的塊已在資料快取中,但塊的版本要晚於一致性讀需要的版本時(版本更早時可直接使用),伺服器程式在資料快取中建立一個新塊利用回滾段資料回滾到需要的版本(如果是在序列化事務中,且造成更晚版本的已提交的修改不是由當前事務造成的話,則報錯)。
資料庫寫入程式(DBW0)
· DBW0程式負責將資料快取中的髒塊寫回磁碟,這個操作在下面的情形下發生:
? 伺服器程式不斷地將髒塊從LRU列表移到髒列表,當髒列表的長度達到閥值時,DBW0將髒列表上的髒塊寫回磁碟;
? 伺服器程式在LRU列表上檢查太多的塊都沒能找到一個可用塊的時候,DBW0直接從LRU列上將髒塊寫回磁碟;
? DBW0程式每三秒被啟用一次,將LRU列表上的髒塊移到髒列表,若髒列表長度達到閥值時,從髒列表上將髒塊寫回磁碟;
? 檢查點發生時,DBW0將髒塊從LRU列表移到髒列表,再從髒列表寫髒塊回磁碟;
? 資料庫關閉時(不包括Shutdown Abort),DBW0將所有髒塊寫回磁碟;
? 表空間熱備前,DBW0將屬於這個表空間的所有髒塊從LRU列表移到髒列表,然後從髒列表將髒塊寫回磁碟;
? 表空間離線時(Normal,Temporary),DBW0將屬於這個表空間的所有髒塊從LRU移到髒列表,然後從髒列表將髒塊寫回磁碟;
? 刪除段時,DBW0先將這個段的髒塊寫回磁碟。
第五章 調整資料快取 2.測量資料快取的效能
資料快取命中率
· 資料快取命中率由下面四個來自V$SYSSTAT的統計值計算得來:
? physical reads 從磁碟讀取的塊數;
? physical reads direct 從磁碟讀取不進入資料快取的資料塊數;
? physical reads direct (lob) 從磁碟讀取不進入資料快取的LOB物件塊數;
? session logical reads 從資料快取中讀取的塊數,包括當前讀(Current, db_block_gets)和一致性讀(consistent gets);
· 命中率 = 1- ((physical reads – physical reads direct – physical reads direct (lob)) / session logical reads),調整好的OLTP系統,資料快取命中率應該在90%以上;
· 查詢語句如下:
select 1 – ((physical.value – direct.value – lobs.value) / logical.value)
from v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
where physical.name = ‘physical reads’
and direct.name = ‘physical reads direct’
and lobs.name = ‘physical reads direct (lob)’
and logical.name = ‘session logical reads’;
資料快取等待
· free buffer inspected 使用者伺服器程式為了將資料從磁碟讀到資料快取,在資料快取中查詢可用的塊,在找到可用塊之前共查詢過的快取塊數;
· free buffer waits 使用者伺服器程式為了將資料從磁碟讀到某個髒塊,需等待DBW0將這個髒塊寫回磁碟;
· buffer busy waits 使用者伺服器程式要存取某個快取塊,如果有其它會話正在使用它,必須等待其完成,可能的原因有:
? 並行插入時表的Free lists不足引發段頭等待(改用LMT可消除此影響);
? 併發事務較多時表的InitTrans太小引發事務等待(增大表的InitTrans);
? 回滾段不足時引發undo header等待(增加回滾段的個數);
· 一起查詢時用下面的語句:
select name,value from v$sysstat where name = ‘free buffer inspected’
union
select event,total_waits from v$system_event where event in (‘free buffer waits’,’buffer busy waits’);
Statspack中存放資料快取效能資料的位置
· Instance Efficiency Percentages (Target 100%)(例項命中率) – Buffer Hit %;
· Instance Activity Stat (例項的活動統計) – free buffer inspected, physical reads, physical reads direct, physical reads direct (lob), session logical reads;
· Buffer Pool Statistics (資料快取統計) -- free buffer waits, buffer busy waits。
第五章 調整資料快取 3.增大資料快取
改進資料快取的效能
改進資料快取的效能有下面一些方法:增大資料快取,用多個資料快取池,將小表CACHE到資料快取,繞過快取池,正確地使用索引
增大資料快取
· 改進資料快取效能最簡單的方法就是增大這塊記憶體,加大資料快取後,快取塊就可以在LRU列表上呆更多的時間,從而提高命中率,free buffer inspected, buffer busy waits, free buffer waits這三個統計值也會相應降低;
· 與資料快取相關的初始引數有下面的一些:
? DB_BLOCK_SIZE 主塊位元組數,在資料庫建立時指定,不能更改,SYSTEM和TEMP表空間只能使用主塊建立,後面提到的調整方法主要是針對主塊快取池來進行討論的;
? DB_CACHE_SIZE 指定預設快取池的大小,不能為零,用於存放主塊;
? DB_KEEP_CACHE_SIZE 指定保持快取池的大小,預設值為零,用於存放主塊;
? DB_RECYCLE_CACHE_SIZE 指定回收快取池的大小,預設值為零,用於存放主塊;
? DB_nK_CACHE_SIZE
· 動態修改資料快取的大小;可以用ALTER SYSTEM命令動態修改資料快取的大小,但必須記住下面三條規則:
? 最終生效的大小是最小粒度的整數倍;
? 共享池,資料快取,日誌快取之和不能大於SGA_MAX_SIZE的值;
? DB_CACHE_SIZE不能指定為零。
· 手工更改資料快取的大小:關閉例項,更改引數,再重啟,這種方法適於同時更改SGA_MAX_SIZE;
· 確定資料快取的合適大小:用Buffer Cache Advisory
? 設定引數DB_CACHE_ADVISE的值為ON(設定為OFF時關掉ADVISORY,設為READY時預先給ADVISORY分配記憶體,但不分配CPU,以防將該引數改為ON時出現記憶體不足的錯誤);
? 待ADVISORY執行一段時間(30分鐘以上)後,再查詢V$DB_CACHE_ADVICE,相關欄位的意義如下表:
ü ID 快取池編號
ü NAME 快取池的名字
ü BLOCK_SIZE 塊大小
ü ADVISE_STATUS 引數的狀態:ON, OFF, READY
ü SIZE_FOR_ESTIMATE 評估快取大小(M)
ü ESTD_PHYSICAL_READS 評估的物理讀
? 評估的物理讀趨於穩定時的評估快取就是最合適的大小。
第五章 調整資料快取 4.用多個資料快取池
用多個資料快取池
· 預設情況下,資料快取中只存在一個(預設)快取池,有可能出現這樣的情形,某個使用者程式偶爾存取一個很少使用的大表(非全表掃描),將快取中其它使用者經常使用的快取塊擠出,為了解決這個問題,可以定義多個快取池,將段明確地指定給某個快取池;
· 可以建立三種快取池,根椐段被存取頻率的不同將段指定給不同的池:
? Keep Pool 用於存放你想在快取中保留時間儘可能長的段;
? Recycle Pool 用於存放你想在快取中保留時間儘可能短的段;
? Default Pool 存放不同於上面的其它的段;
· 與8i不同,9i各個池的記憶體分配是相互獨立的;
· 確定哪些段適於存放在哪個快取池中;
? 要確定段與快取池的對應關係,需要對應用程式,段及段的存取方式有一個整體的瞭解;
? 瞭解目前已快取的段的資訊有助於確定段與快取池的關係,V$BH, V$CACHE中都含有快取的詳細資料,下面兩個查詢作用類似,都能確定已快取塊的段名,所屬使用者名稱,段型別及快取塊數:
ü Select Obj.Owner,
Obj.Object_Name,
Obj.Object_Type,
Count(Distinct Bh.Block#) "Num of Buffers"
From V$bh Bh, Dba_Objects Obj
Where Bh.Objd = Obj.Object_Id
And Owner <> ’SYS’
Group By Obj.Owner, Obj.Object_Name, Obj.Object_Type;
ü Select u.Username,
c.Name,
c.Kind,
Count(Distinct c.Block#) "Num of Buffers"
From V$cache c, Dba_Users u
Where c.Owner# = u.User_Id
And u.Username <> ’SYS’
Group By u.Username, c.Name, c.Kind
? 推薦經常使用且小於預設快取池10%的段置於Keep池中;
? 推薦只由個別事務使用且大於預設快取池200%的段置於Recycle池中;
· 確定每個池的合適大小;在確定了段和各個池的對應關係後,可以透過DBA_SEGMENTS.BLOCKS查出對應池的段塊之和,計算出各個池佔用比例,再根椐快取池的總大小可以確定每個池的大小;在末經精確計算的情況下,ORACLE推薦先按下面的比例為各個池分配空間:Default Pool 60%, Keep Pool 30%, Recycle Pool 10%。
· 建立快取池;根椐前面提到的方法,動態或手工更改這三個引數(DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE),可以建立快取池;
· 將段指定給快取池;
? 可以在建立段時指定快取池:Create … STORAGE ( BUFFER_POOL pool);
? 也可以更改段的快取池屬性:Alter … STORAGE ( BUFFER_POOL pool);
? 上面的pool可選值為KEEP, RECYCLE, DEFAULT(預設值);
? DBA_SEGMENTS.BUFFER_POOL欄位可以查到段的快取池屬性;
? 更改段的快取池屬性並不會立即生效,需等到段下一次從磁碟載入快取池時才能生效。
· 監控各個快取池的效能;
? V$BUFFER_POOL效能檢視: Name(快取池的名字), Block_Size(池的塊大小,Byte), Current_Size(快取池的當前大小,M)。
? V$BUFFER_POOL_STATISTICS,包含每個快取池的相關統計,可用來計算單獨快取池的命中率,重要的欄位如下:
ü NAME
ü DB_BLOCK_GETS
ü CONSISTENT_GETS
ü PHYSICAL_READS
ü FREE_BUFFER_INSPECTED
ü BUFFER_BUSY_WAITS
ü FREE_BUFFER_WAITS
ü Select Name "Buffer Pool",
1 - (Physical_Reads / (Db_Block_Gets + Consistent_Gets)) "Hit Ratio"
From V$buffer_Pool_Statistics
Where Db_Block_Gets + Consistent_Gets > 0;
ü 經過調整後各個快取池的命中率,Keep池的應該很高,Recycle池的應該很低,Default池應該為70~80%。
· 命中率高並不總是代表效能好;
? 單純的快取命中率高並不代表快取的效能很好,在RBO下,不正確的建立索引可能導致效能低下而快取命中率卻相當高,比如在一個經常使用表的低集勢欄位上建二叉樹索引就可能出現這種情形,系統不停而低效地掃描索引,導致出現虛高的快取命中率;
? 透過分析V$BH,V$CACHE的查詢結果,結合對應用程式工作方式的理解,可以發現這種情況;
? 按下面的處理可以消除這種可能:
ü 收集方案的統計並使用基於CBO的最佳化器;
ü 建立在Where條件中使用率高的欄位的柱狀圖統計;
ü 正確地使用多個快取池。
第五章 調整資料快取 5.其它提高資料快取效能的方法
將小表CACHE到資料快取
· 在多個快取池的配置下,每個快取池都是由獨立的LRU演算法來管理的,通常情況下剛存取的塊都是放在LRU列表的開始端,而FTS(全表掃描)例外,剛讀入的塊放在LRU列表的末端;
· 上述演算法會產生如下一些困境:CBO在讀取一些小表或者讀取表中的較多資料時會使用FTS,這時,即使這些表使用頻率很高,也會因為上面提到的原因而很快被老化,在下次用到時又得重新讀入;
· 為了解決這個難題,引進了Cache表的概念,將表設為Cache後,對錶的FTS不再是將塊放在LRU列表的末端,而是置於LRU列表的開始端;
· 有下面三種方法將表設為Cache:
ü 建立時指定CACHE關鍵字:Create table … cache;
ü 更改時指定CACHE關鍵字:Alter table … cache;
ü 查詢時指定CACHE hint:select /*+ cache */ * from …;
· 從DBA_TABLES.CACHE欄位可以查到由前兩種方法設定的表的CACHE屬性。
繞過快取池
· 下面兩種特定的操作可以繞過快取池,讀入的資料塊不進入資料快取,而存放在記憶體中由使用者伺服器程式控制的其它區域(UGA,PGA?):
ü Sort Direct Writes(第八章調整IO時會講到);
ü Parallel DML(由多個伺服器程式來執行一個DML操作,只有當系統中有多個CPU,多個IO子系統以及足夠記憶體時才可考慮作這樣的設定,並行DML超出本書討論的範圍)。
正確地使用索引
· 不正確的全表掃描會極大地降低資料快取的命中率,建立正確的索引後可以提高資料快取效能;
· 建議儘可能地在外來鍵上建立索引,這可以提高多表連線的效率。
第六章 調整SGA的其它區域 1.共享伺服器的概念
第六章 調整SGA的其它區域
· 已討論過的共享池,資料快取和下一章將要討論的日誌快取是每一個ORACLE環境下的必備元件,這一章討論SGA的另外三個可選元件:共享伺服器,大池,Java池。
共享伺服器的概念
· 每一個Oracle應用程式有兩個與之相聯的程式,一個是執行在客戶端機器或者應用伺服器上的使用者程式,一個是執行在Oracle伺服器上的伺服器程式;
· 預設的專用伺服器配置下,每一個伺服器程式只專職於處理一個使用者會話的請求,在Unix上,伺服器程式是一個可用ps命令觀測到的單獨的程式,在Windows系統上,伺服器程式是一個執行於oracle.exe程式中的執行緒;
· 另有一種配置稱為共享伺服器,少數一些伺服器程式為所有的使用者程式服務,在9i以前的版本,這種配置也稱為MTS(多執行緒伺服器);
· 專用伺服器和共享伺服器的差別有點類似於外出時坐專車和打計程車的區別,專用伺服器能更有效地實現使用者程式和例項間的通訊,但資源利用率低,共享伺服器資源利用率高,在相同的CPU和記憶體條件下可以支援更多的併發使用者,但配置不當時會引起使用者程式較長時間的等待從而降低系統的效能和響應速度。
第六章 調整SGA的其它區域 2.共享伺服器的架構
共享伺服器的架構
共享伺服器配置包含以下元件:
· 使用者程式(User Process) 使用者程式可能由客戶端軟體產生,也可能透過中間元件產生,用於管理到Oracle伺服器的連線;
· 網路監聽程式(Oracle Net Listen Process) 監聽程式用於監聽來自使用者程式的對資料庫的查詢或DML請求,並將這些請求分配給當前比較清閒的某個排程程式;
· 排程程式(Dispatcher Process) 排程程式是Oracle的後臺程式,用於接受來自使用者程式的請求並返回結果,最多隻能有五個同時執行的排程程式,在Unix上可以用ps命令看到,用Unix kill命令殺掉一個排程程式時會同時斷開這個程式負責的所有使用者程式;
· 請求佇列(Request Queue) 請求佇列用於存放排程程式接受到的請求,存在於SGA中,一個例項只有一個;
· 共享伺服器程式(Shared Server Process) 共享服務程式是Oracle的後臺程式,用於與SGA互動來處理使用者程式的請求,功能與專用伺服器類似(用於解析SQL語句,將資料塊從磁碟讀入資料快取,等等),伺服器程式的最大數量由作業系統指定;
· 響應佇列(Response Queue) 響應佇列用於存放共享伺服器程式處理的結果,存在於SGA中,每個排程程式對應一個,排程程式將這些結果返回請求的使用者程式;
· 必須滿足下麵條件時才可配置成共享伺服器:
? 眾多的應用程式使用者; 一般併發使用者數在200以上時需要考慮,具體要看伺服器的CPU和記憶體資源;
? 事務時間短;長事務會造成少數使用者獨佔伺服器程式,而使其它使用者長時間地等待,不適於配置成共享伺服器。
? 不連續的事務;使用者活動間有時常的停頓,通常OLTP事務就是如此,這時伺服器程式能為其它使用者提供服務。
第六章 調整SGA的其它區域 3.配置共享伺服器
配置共享伺服器
· 配置共享伺服器時需要正確地設定下面幾個初始化引數,這些引數用於指定例項啟動時產生的排程程式和共享伺服器程式的數量,以及執行期間如何管理這些程式;
? DISPATCHERS 指定例項啟動時產生的對應網路協議的排程程式數量,可選值是0-5;
? MAX_DISPATCHERS 指定例項允許的最大排程程式數,預設值為5,排程程式的增減必須由管理員手工指定(Alter system set dispatchers = ?);
? SHARED_SERVERS 指定例項啟動時產生的共享伺服器程式數量,設為零時禁用共享伺服器選項,最小值為1,最大值依賴於作業系統;
? MAX_SHARED_SERVERS 指定例項允許的共享伺服器的最大數量,最大值依賴於作業系統,伺服器程式可由PMON後臺程式根椐系統負載來動態增減;
? CIRCUITS 用於指定網路連線的虛擬電路最大數量;
? PROCESSES 用於指定例項允許的程式的最大數量;
· 管理員執行管理操作時不能使用共享伺服器,必須啟動專用的伺服器程式。
第六章 調整SGA的其它區域 4.測量共享伺服器的效能
測量共享伺服器的效能
· 測量共享伺服器配置的效能可用到下面一些效能檢視:
? V$SHARED_SERVER 共享伺服器程式的詳細統計,包括每個程式的空閒和繁忙時間;
? V$QUEUE 包含請求佇列和響應佇列的資訊;
? V$SHARED_SERVER_MONITOR 關於共享伺服器程式的合計資訊,包含經由PMON啟動和終止的共享伺服器程式數,共享伺服器程式的高水位,併發會話的最大數量,虛抑電路的最大數量;
? V$DISPATCHER 排程程式的詳細統計,包括每個程式的空閒和繁忙時間;
? V$DISPATCHER_RATE 包含排程程式服務的歷史和實時的統計;
? V$CIRCUIT 包含連線路徑(使用者程式和排程程式,共享伺服器程式的關係)的統計,
· 測量共享伺服器程式的效能
? 共享伺服器程式的忙百比例:
Select Name,
Decode(Busy + Idle, 0, 0, Round((Busy / (Busy + Idle)) * 100, 4)) "busy_rate"
From V$shared_Server
Where Status != ’QUIT’;
? 使用者請求在請求佇列中的平均等待時間(百分之一秒)
Select Decode(Totalq,
0,
’TOTALQ IS ZERO’,
Round(Sum(Wait) / Sum(Totalq), 4)) "AVG SHARED_SERVER WAIT"
From V$queue
Where Type = ’COMMON’
Group By Totalq;
? 當上面的數值很大或者不斷上升時需要考慮增加SHARED_SERVERS的值;
· 測量排程程式的效能
? 排程時程的忙百分比(當這個比例超過50時,需要增加DISPATCHERS 的值):
Select Name "Dispatcher",
Network,
(Round(Sum(Busy) / (Sum(Busy) + Sum(Idle)), 4)) * 100 "Busy_Rate"
From V$dispatcher
Group By Name, Network;
? 使用者請求等待排程程式排程的平均時間(百分之一秒)
Select Decode(Totalq,
0,
’TOTALQ IS ZERO’,
Round(Sum(Wait) / Sum(Totalq), 4)) "AVG DISPATCHER WAIT"
From V$dispatcher d, V$queue q
Where d.Paddr = q.Paddr
And q.Type = ’DISPATCHER’
Group By Totalq;
? 排程程式服務的連線數量(當前,歷史最高以及差異)
Select Name,
Cur_In_Connect_Rate,
Max_In_Connect_Rate,
Max_In_Connect_Rate - Cur_In_Connect_Rate "VARIANCE"
From V$dispatcher_Rate;
· 查詢共享伺服器環境下的累積活動:
Select * From V$shared_Server_Monitor;
· 查詢使用者程式,排程程式和共享伺服器程式間的對應關係:
Select s.Username, d.Name "DISPATCHER", Ss.Name "SHARED_SERVER"
From V$circuit c, V$session s, V$dispatcher d, V$shared_Server Ss
Where c.Saddr = s.Saddr
And c.Dispatcher = d.Paddr
And c.Server = Ss.Paddr;
第六章 調整SGA的其它區域 5.改進共享伺服器的效能
改進共享伺服器的效能
· 共享伺服器環境下的效能調整方向是,在現有的資源配置下支援更多的使用者,而不是一定要如何提高系統的吞吐量或響應時間;
· 效能問題表現在以下三個方面:相關的SGA元件配置不充分,共享伺服器程式太少,排程程式太少;
· 相關的SGA元件配置
? 共享伺服器配置下,使用者的會話與遊標資訊是存放於UGA中的(專用伺服器配置下存放於PGA中),UGA通常存在於共享池中,共享池的主要功能是用來快取SQL語句及資料字典的,這就要求共享池有足夠的空間,不致於因UGA的消耗而降低系統的庫快取命中率和字典快取命中率;
? 下面的查詢語句可以看到系統UGA佔用的空間,這個空間佔用是動態變化的:
Select Sum(s.Value) "Total UGA Bytes"
From V$sesstat s, V$statname n
Where s.Statistic# = n.Statistic#
And n.Name = ’session uga memory max’;
? 在配置了大池後,部分UGA資料會從SGA中移到大池中;
· 有三種改變共享伺服器程式數量的方法:
? PMON後臺程式能夠根椐系統的負載動態增減伺服器程式的數量;
? 管理員動態增加伺服器程式的數量:Alter system set shared_servers = xx;
? 管理員手工增加伺服器程式的數量:更改初始引數shared_servers的值,再重啟;
· 改變排程程式數量的方法只有兩種
? 管理員動態增加排程程式的數量:Alter system set dispatchers = ‘tcp,5’;
? 管理員手工增加排程程式的數量:更改初始引數dispatchers的值,再重啟;
? 使用者程式在其生命週期裡只和一個排程程式發生聯絡,新加入的排程程式只能為在它之後產生的使用者程式服務;
? Oracle推薦配置是,每個排程程式服務250個左右的併發使用者連線;
第六章 調整SGA的其它區域 6.大池的概念
大池的概念
· 共享池除了用於快取SQL外,還有用於容納下面的一些特殊用途的資料:DBW0附屬程式,UGA,RMAN,Parallel Query,當這些選項被使用後,共享池的命中率可能會下降很多,為了解決這個問題,Oracle提供一個新的記憶體區域來存放這些資料,這就是大池;
· 用LARGE_POOL_SIZE這個引數來配置大池,這個引數預設值是零,可選值在600K到2G之間,一旦配置了大池,Oracle會自動使用大池來快取上面提到的資料;
· PARALLEL_AUTOMATIC_TUNING置為真時,大池的空間是動態的,由系統控制;
· 可以使用下面的查詢看到大池已使用和未使用的記憶體:Select * From V$sgastat Where Pool = ’large pool’;
· 持續觀察上面的查詢,如果發現未使用記憶體很大或者不斷增加,表示大池可能分配了太多的記憶體,如果未使用記憶體很小或者不斷減少,表示可能需要加大大池的記憶體。
第六章 調整SGA的其它區域 7.Java池的概念
Java池的概念
· 在Oracle中配置Java環境時有以下一些引數:
? SHARED_POOL_SIZE JVM快取在共享池中;
? JAVA_POOL_SIZE 快取與JAVA相關的會話資料,預設值20M,取值範圍是1M到1G;(Oracle推薦,對於有JAVA的應用,將這個值設到50M或者更大)
? JAVA_SOFT_SESSIONSPACE_LIMIT 當某個JAVA程式請求的記憶體超過這個限制時,會寫一條訊息到使用者跟蹤檔案,預設值是0,最大值是4G;
? JAVA_MAX_SESSIONSPACE_LIMIT 當JAVA程式請求的記憶體超過這個引數的限制時,返回ora-29554的錯誤,預設值是0,最大值是4G;
· 測量JAVA池的效能有下面兩種方法:
? Select * From V$sgastat Where Pool = ’java pool’; 觀察這個查詢,如果發現未使用記憶體很大或者不斷增加,表示JAVA池可能分配了太多的記憶體,如果未使用記憶體很小或者不斷減少,表示可能需要加大JAVA池的記憶體。
? 觀察Statspack中的SGA breakdown difference,裡面有JAVA池free memory的起始值和終止值,如果終止值總是很小或者接近零,表示JAVA池可能太小了;
· 改進JAVA池的效能主要是增大JAVA_POOL_SIZE這個引數,這個引數不能動態調整。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12402/viewspace-897388/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (zt)Oracle效能調整Oracle
- Oracle效能調整筆記Oracle筆記
- Oracle 9i效能調整 [ZT]Oracle
- <轉>oracle效能調整讀書筆記(1)Oracle筆記
- <轉>oracle效能調整讀書筆記(2)Oracle筆記
- <轉>oracle效能調整讀書筆記(3)Oracle筆記
- <轉>oracle效能調整讀書筆記(4)Oracle筆記
- <轉>oracle效能調整讀書筆記(5)Oracle筆記
- oracle高效能sql調整-筆記1 (轉發)OracleSQL筆記
- 讀書筆記-高階owi與oracle效能調整-oracle internal筆記Oracle
- oracle 效能調整Oracle
- 讀書筆記-高階owi與oracle效能調整-io筆記Oracle
- 讀書筆記-高階owi與oracle效能調整-segment筆記Oracle
- 讀書筆記-高階owi與oracle效能調整-transaction筆記Oracle
- 筆記: Oracle 11g效能調整(11.2)目錄筆記Oracle
- [zt]Oracle Tuning (Oracle 效能調整)的一些總結Oracle
- Oracle效能調整之--DML語句效能調整Oracle
- 讀書筆記-高階owi與oracle效能調整-network筆記Oracle
- 讀書筆記-高階owi與oracle效能調整-share pool筆記Oracle
- 讀書筆記-高階owi與oracle效能調整-cache buffer筆記Oracle
- SQL語句效能調整原則(zt)SQL
- oracle效能調整(1)Oracle
- oracle效能調整(2)Oracle
- ORACLE效能調整--1Oracle
- ORACLE效能調整---2Oracle
- Oracle 效能調整for HWOracle
- oracle效能調整2Oracle
- 讀書筆記-高階owi與oracle效能調整-latch和lock筆記Oracle
- Oracle效能優化視訊學習筆記-動態調整SGAOracle優化筆記
- SQL Server 2005效能調整二(zt)SQLServer
- Oracle效能調整-1(轉)Oracle
- Oracle效能調整-2(轉)Oracle
- Oracle效能調整-3(轉)Oracle
- Oracle RAC 的監控和調整 (zt)Oracle
- Oracle效能最佳化調整--調整緩衝區快取記憶體Oracle快取記憶體
- Oracle 9i 整體效能優化概述草稿之四:調整磁碟I/O (zt)Oracle優化
- Oracle效能最佳化調整--調整重做機制Oracle
- SQL Server效能調優札記 [zt]SQLServer