本文希望通過系統地介紹這方面的有關概念
讓大家能更好地規劃使用數據空間
正確使用Oracle提供的有關功能特性
提高應用的執行效率
數據庫空間的有效使用和維護不僅是數據庫管理的重要工作也是大多數開發人員所關心的內容因為它直接關系到數據庫性能的發揮同時數據碎片是經常令人頭疼的問題碎片不僅造成空間的浪費更重要的是會直接影響應 用程序的響應速度
Oracle提供了不少方法用於數據空間的使用監控和維護同時也在各版本中陸續對這方面的功能進行了增強目的在於簡化這方面工作的復雜度提高應用的運行效率
一相關概念
數據庫的空間在邏輯上分為多個表空間每個表空間則由系統中的一個或多個物理數據文件構成Oracle存儲數據的基本單位是塊其大小在建庫時由DB_BLOCK_SIZE參數確定一個或多個連續的塊構成一個區片(EXTENT)它作為數據對象存儲的基本單位來使用在Oracle中每個基本數據對象使用的空間稱為段(Segment)段存放在唯一的表空間上每個段實際上是一系列區片(更為准確地是數據塊)的集合每個簡單數據對象對應一個段對於分區對象如分區表索引則每個(子)分區對應一個段由各個(子)分區共同構成一個完整的數據對象因此可以把表空間看作桶裡面放著許多段一個段只能放在一個桶中而不能跨越多個桶
二表空間的使用
◆表空間碎片的產生
由於同一個表空間中存放有多個數據段各個數據段可以有不同的區片尺寸不同段的區片可以交叉存放當這些段中的區片經過分配(如創建表)釋放(如刪除表)後就可能使表空間中原本連續的空閒數據塊變成不連續而區片必須由連續的數據塊構成這時當某一段需要分配新的區片時就有可能出現雖然表空間空閒數據塊的總和大於所需區片的大小但卻無法找到一串連續的塊來供此區片分配使用這種情況就稱為表空間的Extent Fragmentation我們經常會遇到這種情況明明從DBA_FREE_SPACE中計算表空間還有幾百MB但其中的某一個表卻無法再擴展幾個MB的空間
◆消除表空間碎片
Oracle在段的區片分配上為用戶提供了很大的靈活性然而如果未能正確使用創建表空間和數據對象的各個可選擇參數則在最後將不可避免的要面對區片碎片的問題Oracle 的Bhaskar Himatsingka 和 Juan Loaiza為此提出了SAFE(Simple Algorithm for Fragmentation Elimination)配制規則通過遵循這套規則區片級碎片可以完全的避免而實際上Oraclei引入的新特性Local Managed Tablespace就是SAFE規則在Oracle Server的內置實現SAFE原則概括起來包括
對每個表空間上的段使用相同的區片尺寸段參數INITIAL=NEXTPCTINCREASE=可以通過使用Create Tablespace 的 MINIMUM EXTENT 子句來確保分配的區片是此參數的倍數
僅在表空間級指定INITIALNEXT參數在創建數據段時不要指定這些參數
區片的大小根據段大小來確定原則是均衡順序掃描的效率和空間的利用率同時確保段的區片數目控制在之下根據此原則在進行相應測試之後確定以下區片選取規則
段大小(Oracle)
區片大小(Oracle)
段大小(Oracle)
區片大小(Oracle)
&M
K
&M
K
MG
M
MG
M
&G
M
&G
M
有此數據庫中可以只使用三種區片大小的表空間在對象創建之前需對其大小進行評估並放到相應的表空間中
Oracle引入了本地管理表空間它在管理和性能上都優於傳統的字典管理表空間它已融合了規則 要使用此特性在CREATE TABLESPACE語句中指定EXTENT MANAGEMENT LOCAL子句
段的區片數目上限應在之下DML操作在此區片數目范圍內不會有明顯的性能差異但某些DDL操作的速度則與區片的數目關系較大因此合理的區片數目應保持在之下對於持續不斷擴展的段應監控區片數目在必要時移至其它表空間
對於特別大的數據段應控制在G-G(Oracle為G-G)之間它們應存放到單獨的表空間上同時對於這些特大段應考慮使用分區拉提高性能
用戶的臨時表空間應使用TEMPORARY類型
當系統的事務規模比較均衡時可以對回滾段使用OPTIMAL參數否則應避免制定OPTIMAL參數而定期監控回滾段的大小並在必要時重建
臨時段和回滾段絕對不要將用戶數據存放到SYSTEM表空間它是專為永遠不會Drop和Truncate的系統數據對象而設計的
創建表空間時指定數據文件的大小應=區片整數倍+數據塊對於Local Managed Tablespace則為區片整數倍+K
當表空間使用統一的區片大小時不要對其進行空間整理重整的結果不僅耗費精力而且可能會使性能變差對於未使用統一的區片尺寸的表空間應通過Export/Import重整
i 提供了Alter Table …Move [Tablespace…]命令可用於快速重整表Alter Index …Rebuild…[Tablespace…] 命令可用於快速重建索引
◆有關使用單個區片的誤導
在許多關於碎片整理的文檔中建議在Export時使用Compress=Y選項將表中的所有數據調整到一個區片中期望在Import後獲得良好性能由此讓許多人產生一個觀點認為當表中數據全部存放到一個區片中時可以獲得良好性能實際上單區片段只在以下條件成立時才具有優越性
◆數據主要以(全段)掃描方式訪問
段所對應的數據塊在物理磁盤上連續存放Oracle可以發布較大的順序磁盤讀操作
通過對這兩條進行分析可以發現一方面數據庫中大部分表是通過索引來訪問另一方面現在的數據庫文件一般在物理上使用了RAID或RAID+技術數據以條帶化方式分布到多個物理磁盤上邏輯上的單個區片和多區片在物理上並無本質上的區別另外從Oracle的角度來看管理幾百個區片的段是非常輕松的並不會有性能的下降由此可見將整個段放到一個區片中並無明顯好處而這種做法卻會導致表空間碎片的產生
三表數據段的使用
◆表空間的組織
Heap表的空間由一系列區片鏈接而成每個數據塊除塊頭外其余部分可用於存放數據在創建表時可以指定以下參數
PCTFREE塊中保留用於UPDATE操作的空間百分比當數據占用的空間達到此上限時新的數據將不能再插入到此塊中
PCTUSED指定塊中數據使用空間的最低百分比當一個塊在達到PCTFREE之後經歷了一些DELETE操作在其空間使用下降到PCTUSED後便可以重新被用於INSERT數據這就是PCTFREE/PCTUSED參數的含義
調整PCTFREEPCTUSED參數的目標一方面是提高性能另一方面則主要是提高空間使用效率避免出現塊中存在有許多未用的空間但卻無法找到一個塊可以被用於插入新數據行的情況發生
◆PCTFREE的使用
在Oracle中表的每一行數據由唯一的ROWID標記而Oracle支持的數據類型中有一些長度是可變的如VARCHAR當對這些數據進行UPDATE時如果塊中的可用空間不能容納UPDATE後的數據行時Oracle將會把此行移到其它數據塊同時保留此數據行的ROWID不變並在原有塊中建一指針指向行遷移後的位置在這種情況下讀取一行數據將需要訪問個數據塊從而導致性能下降PCTFREE保留的空間就是為確保更改後的數據行可以仍存放於原有數據塊中避免行遷移的情況發生
由此如果PCTFREE設置不足時可能產生行遷移而另一方面如果PCTFREE設置過高將會造成空間浪費因此正確設置PCTFREE需要對表中數據的使用進行分析對於數據長度不會變化或極少更新的情況可以采用較小的PCTFREE對於其它大多數情況應采用稍大的PCTFREE(PCTFREE的缺省值是如果不好估計需預留的空間可以使用-的范圍)不要為節約塊中的空間而使用較小的PCTFREE值
◆PCTUSED的使用
當塊的使用的空間下降到PCTUSED後此塊被重新放回空閒鏈表(Freelist)中作為後續Insert的候選塊同樣設置PCTUSED需要視數據行的特性和InsertUpdateDelete的模式而定但必須遵守的原則是db_block_size * ( PCTFREE PCTUSED)必須比行的長度大
對於數據行長度變化較大的情況應使用最大行長度來計算PCTUSED並且應使用較低的PCTUSED值因為在執行Insert時如果數據塊的可用空間不能裝下一行數據當塊的使用的空間是在PCTUSED之上Oracle將把此塊從Freelist中移走當塊的使用的空間是在PCTUSED之下Oracle將會擴展段空間因此PCTUSED如果設得過高將導致段的不斷擴展
當數據行長度不大時使用缺省的PCTUSED()是比較合適的對於行長度較大的情況最長的行有可能會占用半個以上的塊空間此時可設置PCTUSED為較小的PCTUSED僅在表中的數據以隨機方式被刪除而且仍有一些行長時間保留在塊中時才會造成空間使用上的問題因為這些塊可能需要較長的時間才能或永遠不能重新被用於存放新數據在這種應用中如果空間利用率一直處於較低水平則需對PCTUSED進行分析和調整
From:http://tw.wingwit.com/Article/program/Oracle/201311/16713.html