[轉]Oracle DB 管理空間

• 介紹Oracle DB Server 如何自動管理空間
• 使用壓縮節省空間
• 主動監視和管理表空間的空間使用量
• 介紹Oracle DB 中的段的建立
• 控制延遲建立段
• 使用「段指導」
• 使用段收縮功能從表和索引中回收浪費的空間
• 管理可恢復的空間分配
 
  • 空間管理:概覽
空間由Oracle DB Server 自動管理。Oracle DB Server  能夠生成有關潛在問題的預警,並推薦可能的解決方案。
這些功能包括:
• Oracle Managed Files (OMF)
• 用位圖進行的空閒空間管理(「本地管理」)和數據 文件自動擴展
• 主動的空間管理(默認閾值和服務器生成的預警)
• 空間回收(收縮段、聯機從新定義表)
• 容量計劃(增加報表)
 
空間管理:概覽
經過使用Oracle Managed Files (OMF),你能夠根據數據庫對象(而不是文件名)來指定 操做。Oracle DB Server 能夠用 位圖來管理表空間內的空閒空間 。這稱爲「本地管理的」 表空間。此外,位於本地管理的表空間中的段內的空閒空間可使用位圖進行管理。這稱 爲「自動段空間管理」。位圖化的實施能夠避免不少與空間相關的表優化工做,同時能在 高峯負載期間提供更高的性能。另外,Oracle DB Server 還能夠自動擴展數據文件,所以 文件能夠根據其中的數據量自動增加。
建立數據庫時,默認狀況下將啓用預先空間監視。(這不會對性能產生任何影響。)
Oracle DB Server 在正常空間分配和取消分配操做期間監視空間使用狀況,若是空閒空間 的可用性低於預約義的閾值(能夠覆蓋此閾值),將發出預警。指導和嚮導可幫助你回收 空間。
計劃容量時,Oracle DB Server 根據表結構和行數進行空間估計,並根據自動工做量資料 檔案庫(AWR) 中存儲的歷史空間使用狀況來提供增加趨勢報表。
 
  • 塊空間管理
 
塊空間管理
空間管理包括塊級別的空閒空間管理。使用「自動段空間管理」時,每一個塊分爲四部分, 分別稱爲FS1(空閒空間介於0 到25% 之間)、FS2(25% 到50% 空閒)、FS3(50% 到 75% 空閒)和FS4(75% 到100% 空閒)。
塊的狀態將根據其中空閒空間的級別自動更新。這樣,你就能夠根據所插入行的長度來判 斷特定塊可否知足插入操做的要求。請注意,「滿」狀態表示不能再向塊中插入。
在示例中,左側的塊是一個FS3 塊,由於其空閒空間介於50% 和75% 之間。執行 了一些插入和更新語句後,將達到PCTFREE(虛線處),而且不能再向該塊中插入新行。
如今該塊被視爲「滿」或FS1 塊。塊的空閒空間級別一旦降至低於下一部分,就會考慮 將該塊再次用於插入。在上面這種狀況中,空閒空間一旦超過25%,狀態即變爲FS2。
注:大對象(LOB) 數據類型(BLOB、CLOB、NCLOB和BFILE)不使用PCTFREE存儲 參數。未壓縮塊和OLTP 壓縮塊的默認PCTFREE值爲10;基本壓縮塊的默認PCTFREE 值爲0。
 
  • 行連接和行遷移
示例:
• 更新時:行的長度增長,超過了塊中 的可用空閒空間。
• 須要將數據存儲在新塊中。
• 將保留行的原始物理標識符(ROWID)。
• Oracle DB Server 須要讀取兩個塊來 檢索數據。
• 「段指導」查找包含遷移行的段。
• 能夠對塊中的碎片空閒空間進行自動 合併。
 
行連接和行遷移
在如下兩種狀況下,表中某行的數據可能太大,沒法包含在單個數據塊中。
第一種狀況:
在第一次插入行時,就發現行太大,沒法包含在一個數據塊中。在這種狀況下,Oracle DB  Server 將在爲該段保留的一系列數據塊(一個或多個)中存儲該行的數據。較大的行一般 要進行行連接,例如包含數據類型爲LONG或LONG RAW的列的行。在這些狀況下,行鏈 接是沒法避免的。
但在第二種狀況中,
最初能夠包含在一個數據塊中的行在更新後,整個行的長度增長了, 而塊的空閒空間已經徹底填滿。在這種狀況下,Oracle DB Server 假定整個行能夠包含在新 數據塊中,從而將整個行的數據遷移到新數據塊中。數據庫將保留遷移行的原始行片斷,
以便指向包含遷移行的新塊。遷移行的ROWID不變。
當行連接或遷移後,與此行關聯的輸入/輸出(I/O) 性能會下降,由於Oracle DB Server 必須 掃描多個數據塊來檢索該行的信息。
「段指導」查找包含由UPDATE操做產生的遷移行的段。
 
Oracle DB 在如下狀況下會以自動透明方式合併數據塊的空閒空間:
• INSERT或UPDATE語句嘗試使用包含足夠空閒空間的塊來容納新的行片斷
• 空閒空間已成爲碎片,以至於行片斷沒法插入到塊的相鄰部分
合併以後,空閒空間量與操做前的空間量相同,但空間如今是連續的。
 
當行連接或遷移後,與此行關聯的I/O 性能會下降,由於 Oracle DB Server 必須掃描多個數據塊來檢索該行的信息。
 
  • 段內的空閒空間管理
段內的空閒空間管理
• 由 段中的位圖跟
好處:
• 空間使用更加靈活
• 運行時調整
BMB 的多進程搜索
 
空閒空間管理
能夠自動管理數據庫段內的空閒空間。段內的空閒空間或已用空間由位圖跟蹤。要利用此 功能,請在建立本地管理的表空間時,指定「自動段空間管理」。而後,指定的設置將應 用於隨後在此表空間中建立的全部段。
自動空間管理段具備一組位圖塊(BMB),用於描述該段中數據塊的空間使用狀況。BMB  以樹形層次結構組織。層次的根層存儲在段頭部中,其中包含對全部中間層BMB 的引用。
此層次的各個葉節點表明屬於該段的一組連續數據塊的空間信息。此層次的最大層數爲三。
使用自動空間管理的好處包括:
• 改善空間使用狀況,尤爲是各行大小差別很大的對象的空間使用狀況
• 對並行訪問發生的變化進行更好的運行時調整
• 在性能方面或空間使用方面改善多實例行爲
所以,DBA 能夠少作一些工做。
 
  • 段的類型
段是爲某個邏輯結構分配的一組區。段包括如下不一樣類型:
• 表和簇段
• 索引段
• 還原段
• 臨時段
段由Oracle DB Server 動態分配。
 
段的類型
表和簇段:每一個非聚簇表都有一個數據段。全部表數據都存儲在表段的區中。對於分區表, 每一個分區都有一個數據段。每一個集羣也都有一個數據段。集羣中每一個表的數據都存儲在集 羣的數據段中。
索引段:每一個索引都有一個索引段,存儲其全部數據。對於分區索引,每一個分區都有一個 索引段。
還原段:Oracle DB 會維護用於回退對數據庫所作更改的信息。此信息包括事務處理操做 的記錄;這些操做統稱爲還原。還原信息存儲在還原表空間的還原段中。
臨時段:臨時段是在SQL 語句須要臨時數據庫區域來完成執行時由Oracle DB Server 建立 的。語句完成執行後,臨時段中的區將返回到系統,以備未來使用。
若是段的現有區變滿,Oracle DB Server 將動態分配空間。由於區是根據須要分配的,因此 段中的區在磁盤上可能連續,也可能不連續。
 
  • 分配區
• 搜索數據文件的位圖,以便獲取所需數目的相鄰空閒塊
• 可用如下存儲子句調整區的大小:
– UNIFORM 
– AUTOALLOCATE
• 查看區映射
• 得到取消分配建議
對於本地管理的表空間,Oracle DB Server 將查找要分配給新區的空閒空間,具體方法是:
先在表空間中肯定候選數據文件,而後搜索數據文件的位圖,以便獲取所需數目的相鄰空 閒塊。若是該數據文件沒有足夠的相鄰空閒空間,則Oracle DB Server 將在另外一數據文件 中查找。
如下兩個子句會影響區的大小調整:
• 使用UNIFORM子句,數據庫能夠按你指定的統一大小(或默認大小)爲表空間中 建立的全部對象建立全部區。
• 使用AUTOALLOCATE子句,數據庫能夠爲表空間肯定區大小調整策略。
要在Oracle Enterprise Manager 中查看區映射,請選擇「Server > Tablespaces > View  Tablespace > Show Tablespace Contents(服務器> 表空間> 查看錶空間> 顯示錶空間 內容)」。
Oracle DB Server 提供了「Segment Advisor(段指導)」,使用該指導能夠根據對象中 空間碎片的級別來幫助肯定對象是否有空間可回收。
 
  • 分配空間
新的空間分配方法:
• DEFERRED_SEGMENT_CREATION = TRUE(默認值)
1. Table creation > Datadictionary operation(建立表> 數據 字典操做)
2. DML > Segment creation(DML > 建立段)
 
 
Oracle Database 11gR2 包含了一種新的空間分配方法。建立非分區堆表時,表段建立將延 遲,直至插入第一行。該功能是默認啓用的,即DEFERRED_SEGMENT_CREATION初始 化參數設置爲TRUE。
此新增的空間分配方法的優勢包括:
• 對於安裝時就會建立成百或上千個表(其中大多數可能永遠不會填入內容)的應用程 序而言,能夠節省大量的磁盤空間。
• 縮短了應用程序安裝時間。
在向表中插入第一行後,系統將爲基表、其LOB 列及其索引建立段。在建立段期間,表上 的遊標將失效。這些操做會對性能產生較小的額外影響。
注:使用該新增的分配方法時,務必制定合適的容量計劃以便有足夠的磁盤空間用於處理 填充表時的段建立操做,這一點很是重要。
 
  • 建立沒有段的表
 
SQL> SHOW PARAMETERS deferred_segment_creation 
NAME TYPE VALUE
------------------------------------ ----------- ------
deferred_segment_creation boolean TRUE
SQL> CREATE TABLE seg_test(c number, d varchar2(500));
Table created.
SQL> SELECT segment_name FROM user_segments; 
no rows selected
插入行並建立段:
SQL> INSERT INTO seg_test VALUES(1, 'aaaaaaa');
1 row created.
SQL> SELECT segment_name FROM user_segments; 
SEGMENT_NAME
-------------------------------------------------------
SEG_TEST
 
建立沒有段的表
本示例顯示瞭如何檢查DEFERRED_SEGMENT_CREATION參數。而後建立一個沒有段 的表,可經過查詢USER_SEGMENTS數據字典視圖進行驗證。插入一行後,再次查詢該 視圖以查看如今是否存在段。
還能夠查詢USER_TABLES、USER_INDEXES或USER_LOBS視圖的 SEGMENT_CREATED列。
對於非分區表、索引和LOB,若是建立了段,該列將顯示YES。
數據字典中增長的另外一個對象是SYS.SEG$表,該表用於存儲在建立表或索引期間指定 的存儲參數。
 
  • 控制延遲建立段
在如下項中使用DEFERRED_SEGMENT_CREATION參數:
• 初始化文件
• ALTER SESSION命令
• ALTER SYSTEM命令
使用SEGMENT CREATION子句:
• IMMEDIATE
• DEFERRED(Oracle Database 11gR2 中的默認值)
 
CREATE TABLE SEG_TAB3(C1 number, C2 number) 
SEGMENT CREATION IMMEDIATE TABLESPACE SEG_TBS;
CREATE TABLE SEG_TAB4(C1 number, C2 number) 
SEGMENT CREATION DEFERRED;
注:索引繼承表的特徵。
 
控制延遲建立段
可經過如下兩種方式控制段的建立:
• 將DEFERRED_SEGMENT_CREATION初始化參數設置爲TRUE或FALSE。可在初始 化文件中設置該參數。還能夠經過ALTER SESSION或ALTER SYSTEM命令進行 控制。
示例:
ALTER SESSION SET DEFERRED_SEGMENT_CREATION = TRUE;
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION = FALSE;
 
• 使用CREATE TABLE命令的SEGMENT CREATION子句:
- SEGMENT CREATION DEFERRED:若是指定,則系統將延遲建立段直至表中 插入第一行。這是Oracle Database 11gR2 的默認行爲。
- SEGMENT CREATION IMMEDIATE:若是指定,則在表建立期間對段進行實體 化。這是早於Oracle Database 11gR2 的Oracle DB 中的默認行爲。
該子句優先於DEFERRED_SEGMENT_CREATION參數。
可使用ALTER TABLE … MOVE命令爲已建立的表強制建立段。
不過,對於從屬對象(如索引),沒法直接控制延遲建立段。它們繼承其父對象(在本例 中爲表)的這一特徵。
 
  • 限制和例外
按需建立段:
• 僅適用於非分區表和索引
• 不適用於IOT、聚簇表或其它特殊表
• 不適用於字典管理的表空間中的表
注:若是計劃將沒有段的表從本地管理的表空間遷移到 字典管理的表空間,則必須將其刪除並從新進行建立。
 
限制和例外
• 在Oracle Database 11gR2 中,延遲建立段被限制於非分區表和非分區索引。不支持 IOT 和其它特殊表。
• 對於聚簇表和在字典管理的表空間中建立的表,不支持按需建立段。若是嘗試這樣作, 系統將建立段。
• 若是在本地管理的表空間中建立了一個採用延遲建立段的表,則該表沒有段。若是稍 後將該表空間遷移到字典管理的表空間,則任何建立段的嘗試都將產生錯誤。此時, 必須將該表刪除並從新進行建立。
• 對於聚簇表、全局臨時表、特定於會話的臨時表、內部表、類型化表、AQ 表、SYS 擁有的表、外部表、位圖聯接索引以及域索引,不支持按需建立段。歸SYSTEM、 PUBLIC、OUTLN以及XDB全部的表也不在支持範圍內。
 
  • 其它自動功能
沒有用戶干預:
• 不能用的索引和索引分區沒有段
• 建立沒有段的索引:
CREATE INDEX test_i1 ON seg_test(c) UNUSABLE;
• 刪除索引的任何已分配空間:
ALTER INDEX test_i UNUSABLE;
• 爲索引建立段:
ALTER INDEX test_i REBUILD;
 
SELECT segment_name, partition_name, 
segment_type 
FROM user_segments 
WHERE segment_name like '%DEMO';
 
其它自動功能
Oracle Database 11g發行版2 中還實施了其它加強功能(與延遲建立段無關)以節省空間: 建立的全部UNUSABLE索引和索引分區都沒有段。該功能對你是徹底透明的。該功能默認 爲啓用,即COMPATIBILITY初始刷參數設置爲11.2.0.0。
示例:若是你有一個DEMO表,它有三個分區和一個本地索引,則在執行查詢時會看到 三個表段和三個索引段。
若是將一個表分區移至新的表空間,而後執行一樣的查詢,你將看到三個表段和兩個索引 段,這是由於不可用的一個已經自動刪除。
 
  • 表壓縮:概覽
經過壓縮全部數據減小存儲成本:
• 基本壓縮適用於直接路徑插入操做:10x
• OLTP 壓縮適用於全部DML 操做:2–4x
 
典型應用 壓縮比率
{ COMPRESS[ BASIC | FOR { OLTP} ] | NOCOMPRESS }
 
表壓縮:概覽
Oracle DB 支持如下三種表壓縮方法:
• 基本表壓縮
•OLTP 表壓縮
• Hybrid Columnar 壓縮(經過Exadata)
Oracle Corporation 建議壓縮全部數據以減小存儲成本。Oracle DB 可以使用表壓縮來消除數 據塊中的重複值。對於具備高度冗餘數據的表,壓縮可節省磁盤空間並減小數據庫緩衝區 高速緩存中的內存使用。表壓縮對數據庫應用程序是透明的。
• table_compression 子句僅對按堆組織的表有效。COMPRESS關鍵字用於啓用表壓縮。
NOCOMPRESS關鍵字用於禁用表壓縮。NOCOMPRESS爲默認值。
• 經過基本壓縮,Oracle DB 在使用諸如直接加載或CREATE TABLE AS SELECT等 操做執行批量加載時壓縮數據。
• 經過COMPRESS FOR OLTP,Oracle DB 在對錶執行全部DML 操做期間壓縮數據。
 
  • 適用於直接路徑插入操做的壓縮
• 是使用CREATE TABLE …COMPRESS BASIC…; 啓用的
• 建議爲批量加載數據倉庫使用該壓縮方法
• 替換已廢棄的COMPRESS FOR DIRECT_LOAD  OPERATIONS
• 最大化塊中的連續空閒空間
 
 
適用於直接路徑插入操做的壓縮
使用COMPRESS或COMPRESS BASIC可啓用基本的表壓縮。
• Oracle DB 在執行下列直接路徑插入操做期間嘗試壓縮數據(若是這樣作有利):
- 直接路徑SQL*Loader
- CREATE TABLE AS SELECT語句
- 並行INSERT語句
- 帶有APPEND提示的INSERT語句
• 原始導入實用程序(imp) 不支持直接路徑INSERT,所以沒法以壓縮的格式導入數據。
• 在早期版本中,這種類型的壓縮稱爲DSS 表壓縮,是使用COMPRESS FOR  DIRECT_LOAD OPERATIONS啓用的。該語法已廢棄。
• 壓縮消除了塊中因刪除操做而造成的空隙,使塊中連續可用空間達到最大化。
該幻燈片顯示了壓縮表中的數據塊的演變過程,應按從左到右的順序閱讀。開始的時候, 該數據塊是空的,能夠插入數據。開始在該塊中插入數據時,數據以未壓縮的格式存儲 (就像在未壓縮的表中同樣)。不過,只要該塊達到其PCTFREE設置規定的填滿標準, 數據就會自動進行壓縮,以減小其原來佔據的空間。
 
這樣一來,能夠在同一塊中插入新的未壓縮數據,直到再一次達到PCTFREE設置規定的 填滿標準。此時,會再一次觸發壓縮以減小塊中的已使用空間量。
注:採用COMPRESS或COMPRESS BASIC的表使用PCTFREE值0以最大化壓縮,除非 顯式設置PCTFREE子句的值。
採用COMPRESS FOR OLTP或NOCOMPRESS的表使用PCTFREE的默認值10以最大化 壓縮,同時仍容許之後對數據進行一些DML 更改,除非顯式覆蓋該默認值。
 
  • 適用於DML 操做的OLTP 壓縮
• 是使用CREATE TABLE … COMPRESS FOR OLTP…; 啓用的
• 建議爲活動的OLTP 環境使用該壓縮方法
• 替換已廢棄的COMPRESS FOR ALL OPERATIONS
 
 
適用於DML 操做的OLTP 壓縮
使用COMPRESS FOR OLTP可啓用OLTP 表壓縮。
• Oracle DB 在對錶執行全部DML 操做期間壓縮數據。建議爲活動的OLTP 環境使用 這種形式的壓縮。
• 在早期版本中,OLTP 表壓縮是使用COMPRESS FOR ALL OPERATIONS啓用的。 該語法已廢棄。
使用OLTP 壓縮,一個數據塊中行和列中的重複值只在塊的開頭存儲一次(存儲在符號表 中)。重複值被替換爲對符號表的簡短引用(如圖中所示)。所以,從新建立未壓縮 的數據所需的信息存儲在塊中。
爲了說明OLTP 壓縮的原理,示例中的圖表顯示了兩個矩形。第一個灰色矩形包含四個 標記爲「G」的綠色小正方形和六個標記爲「Y」的黃色正方形。它們表示未壓縮的塊。
在第二個灰色矩形的開頭,僅有一個標記爲「G」的綠色正方形和一個標記爲「Y」的黃 色正方形,表示符號表。第二個灰色圖表在與綠色和黃色正方形相同的位置還顯示了 10 個白色的正方形。它們是白色的,由於它們如今僅是引用,重複值不佔用空間。
 
  • 指定表壓縮
能夠爲如下項指定表壓縮:
• 整個按堆組織的表
• 分區表(每一個分區可具 有一種不一樣類型或級別 的壓縮。)
• 嵌套表的存儲
你沒法:
• 爲列數多於255 的表指定 基本壓縮和OLTP 壓縮
• 若是表是針對直接加載而 壓縮的,則你沒法刪除列; 但若是表使用OLTP 壓縮, 則可刪除
 
指定表壓縮
能夠爲如下項指定表壓縮:
• 整個按堆組織的表(在relational_table 或object_table 的physical_properties 子句中)
• 分區表(每一個分區可具備一種不一樣類型或級別的壓縮。)
• 嵌套表的存儲(在nested_table_col_properties 子句中)
表壓縮具備如下限制:
• 不支持對列數多於255 的表使用COMPRESS FOR OLTP和COMPRESS BASIC
• 沒法從針對直接加載操做壓縮的表中刪除列,不過能夠將這類列設置爲未使用。
ALTER TABLE... drop_column_clause 的全部操做對使用OLTP 壓縮的表有效
• 使用Hybrid Columnar 壓縮的表不支持邏輯備用、Streams 和LogMiner
 
  • 使用壓縮指導
壓縮指導:
• 分析對象,估計不一樣壓縮方法所節省的空間
• 幫助肯定應用程序的正確壓縮級別
• 推薦各類壓縮策略
– 爲特定的數據集選取正確的壓縮算法
– 按特定列進行排序,以提升壓縮比率
– 提供各類壓縮算法的折衷方案
• 適用於OLTP 壓縮(經過EM)
 
使用壓縮指導
壓縮指導分析數據庫對象,並肯定每一個壓縮級別可實現的預期壓縮比率。所以,它可幫助 你肯定應用程序的正確壓縮級別。該指導推薦各類壓縮策略。當從EM 訪問壓縮指導時, 它將肯定OLTP 壓縮。
 
  • 使用DBMS_COMPRESSION程序包
肯定最佳壓縮比率:
BEGIN
DBMS_COMPRESSION. GET_COMPRESSION_RATIO ('USERS','SH','SALES', 
NULL,DBMS_COMPRESSION.COMP_FOR_OLTP, blkcnt_cmp, blkcnt_uncmp,
rowcnt_cmp, rowcnt_uncmp, comptype);
DBMS_OUTPUT.PUT_LINE('Blk count compressed = ' || blkcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Blk count uncompressed = ' ||
blkcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Row count per block compressed = ' ||
rowcnt_cmp);
DBMS_OUTPUT.PUT_LINE('Row count per block uncompressed = ' ||
rowcnt_uncmp);
DBMS_OUTPUT.PUT_LINE('Compression type = ' || comptype);
DBMS_OUTPUT.PUT_LINE('Compression ratio = 
'||blkcnt_uncmp/blkcnt_cmp||' to 1');
 
使用DBMS_COMPRESSION程序包
DBMS_COMPRESSION程序包提供的壓縮指導幫助你爲指定表肯定可預期的壓縮比率。
該指導將分析數據庫中的對象,肯定可能達到的壓縮比率,並建議最佳壓縮級別。除了 DBMS_COMPRESSION程序包以外,還能夠在現有指導框架內使用該壓縮指導(經過 DBMS_ADVISOR程序包)。
爲了肯定壓縮比率,DBMS_COMPRESSION程序包提供瞭如下子程序:
• GET_COMPRESSION_RATIO過程,可針對未壓縮表給出可行的壓縮比率。
• GET_COMPRESSION_TYPE過程,針對給定行返回壓縮類型。
 
  • 壓縮表數據
 
 
Oracle DB 支持如下三種表壓縮方法:
• 基本表壓縮
•OLTP 表壓縮
• Hybrid Columnar 壓縮(經過Exadata)
 
  • 預先表空間監視
數據庫如下列方式預先管理表空間的磁盤空間使用量:
• 表空間的可用磁盤空間變低,以及特定段空間不足時,系統會經過數據庫預警通知你。
而後你就能夠爲表空間提供更多磁盤空間,以免空間不足的狀況發生。
• 收集的信息被存儲在自動工做量資料檔案庫(AWR) 中,用於執行增加趨勢分析以及 計劃數據庫的容量。
要在Oracle Enterprise Manager 中查看和修改表空間信息,請在「Database(數據庫)」 主頁中選擇「Server(服務器)」,而後選擇「Tablespaces(表空間)」。選擇須要的表 空間,而後單擊「Edit(編輯)」按鈕。
 
  • 閾值和解決空間問題
經過如下方法解決空間問題:
• 添加數據文件或調整數據文件大小
• 將AUTOEXTEND設置爲ON
• 收縮對象
• 減小UNDO_RETENTION
• 檢查臨時表空間中是否存在長時間運行的查詢
 
閾值和解決空間問題
表空間閾值定義爲「滿」,或者定義爲表空間中的可用空間。嚴重閾值和警告閾值是應用 於表空間的兩個閾值。DBMS_SERVER_ALERT程序包中包含用於設置和獲取閾值的過程。
達到表空間限制大小時,將引起相應的預警。閾值以表空間大小的百分比,或剩餘的空閒 字節數表示。此值在內存中計算。能夠爲表空間同時定義百分比和字節形式的閾值。它們 中的任何一個或二者均可以生成預警。
理想的警告閾值觸發值設置會生成這樣的預警:既能確保有足夠時間來解決問題,使其不 會變成嚴重狀態,又不至於在空間還沒有成爲問題時干擾你。
預警指示DBA 能夠經過執行如下一項或多項操做來解決問題:
• 向表空間添加更多空間,方法是添加一個文件或調整現有文件的大小,或者使現有文 件可自動擴展
• 在包含任何可自動擴展文件的磁盤上釋放空間
• 收縮表空間中的稀疏對象
 
  • 監視表空間的空間使用量
• 只讀表空間和脫機表空間:不要設置預警。
• 臨時表空間:閾值對應於會話當前使用的空間。
• 還原表空間:閾值對應於活動區和未到期區所使用的 空間。
• 可自動擴展的文件:閾值基於最大文件大小。
 
監視表空間的空間使用量
數據庫在執行常規的空間管理活動時跟蹤空間使用狀況。MMON進程每10 分鐘彙總一次 此信息。達到或超過了表空間的閾值時,將觸發預警。
• 不該在處於只讀模式的表空間或已脫機的表空間上標記預警,由於在這些表空間上無 法進行太多操做。
• 在臨時表空間中,閾值必須定義爲對錶空間中已用空間的限制。
• 對於還原的表空間,若是某個區中不包含活動或未到期的還原操做,則該區能夠重用。
計算閾值違規時,活動區和未到期區整體被視爲已用空間。
• 對於包含可自動擴展文件的表空間,將根據你指定的最大文件大小或最大OS 文件大 小來計算閾值。
 
  • 收縮段
 
圖表描述了表收縮操做的兩個階段。第一個階段執行壓縮。在此階段,行將盡 可能移動到段的左側部分。在內部,行將由數據包移動,以免鎖定問題。移動完行後, 將啓動收縮操做的第二階段。在此階段中,將調整高水位標記(HWM),並釋放未使用的
空間。
若是有長時間運行的查詢,並且這些查詢可能跨越收縮操做,並嘗試從已回收的塊中讀取 數據,則COMPACT子句會頗有用。指定SHRINK SPACE COMPACT子句時,收縮操做 的進度將保存在相應段的位圖塊中。這意味着下次在同一個段上執行收縮操做時,Oracle  DB Server 能夠記住已經執行過的操做。而後你就能夠在非峯值時段從新發出SHRINK  SPACE子句,無需使用COMPACT子句便可完成第二階段。
 
  • 收縮操做的結果
• 改善性能和空間使用狀況
• 維護索引
• 不執行觸發器
• 能夠減小遷移行的數量
• 建議在IOT 上重建二級索引
 
收縮稀疏填充的段能夠提升對該段執行掃描操做和DML 操做的性能。這是由於在收縮段 後,須要查看的塊減小了。尤爲體如今下列方面:
• 全表掃描(塊變少、變密)
• 改善索引訪問(因爲樹變得更緊湊,所以減小了ROWID範圍掃描時的I/O 次數)
另外,經過收縮稀疏填充的段,還能夠提升數據庫內空間使用效率,由於在對象須要空間 時有更多空閒空間可使用。
在段收縮操做期間將保證索引依賴關係。收縮了相應表後,索引處於可用狀態。所以,不 須要進一步維護。
實際收縮操做在內部做爲INSERT/DELETE操做進行處理。可是,不執行任何DML 觸發 器,由於數據自己並未發生變化。
段收縮操做的一個可能結果是遷移行的數量減小。可是,你不該老是依賴段收縮來減小遷 移行數量。由於段收縮操做可能不會觸及段中的全部塊。所以,不能保證全部遷移行都得 處處理。
注:建議執行收縮操做以後在索引表(IOT) 上重建二級索引。
 
  • 回收ASSM 段內的空間
• 聯機原地操做
• 只適用於位於ASSM 表空間中的段
• 候選段類型包括:
– 按堆組織的表和索引表
– 索引
– 分區和子分區
– 實體化視圖和實體化視圖日誌
 
使用ASSM 回收空間
收縮操做是一個聯機原地操做,由於不須要額外的數據庫空間便可執行此操做。
• 沒法在由空閒列表管理的段上執行收縮操做。能夠收縮自動段空間管理的表空間中的 段。可是,不能收縮ASSM 表空間中存儲的下列對象:
- 集羣中的表
- 包含LONG列的表
- 包含提交時實體化視圖的表
- 包含基於ROWID的實體化視圖的表
-IOT 映射表
- 包含基於函數的索引的表
• 必須爲按堆組織的段啓用ROW MOVEMENT。
 
  • 段指導:概覽
 
段指導可標識具備能夠回收的空間的段。它經過檢查自動工做量資料檔案庫(AWR) 中的 使用狀況和增加統計數據以及對段中的數據進行採樣來執行分析。能夠將其配置爲按期自 動運行,也能夠根據須要(手動)運行它。按期調度的段指導運行稱爲「自動段指導」。 提供建議以後,你能夠選擇實施這些建議。能夠在段級別或表空間級別調用收縮指導。
EM 數據庫控制檯是段指導的接口。能夠從EM 中的幾個位置訪問段指導:
• 「Advisor Central(指導中心)」頁
• 「Tablespaces(表空間)」頁
• 方案對象頁
使用數據庫控制檯能夠選擇不一樣的輸入信息,並能夠調度一個調用段指導的做業來得到收 縮建議。能夠在表空間環境中或方案對象環境中調用段指導向導,沒有相關環境也能夠 調用。
段指導能夠根據採樣分析、歷史信息和將來增加趨勢來提供建議。
 
  • 段指導
 
在「Server(服務器)」頁中的「Storage(存儲)」部分,選擇「Tablespaces(表空間)」。
在「Tablespaces(表空間)」頁上,選擇要對其執行收縮分析的表空間,而後在「Actions (操做)」下拉列表中選擇「Run Segment Advisor(運行段指導)」。單擊「Go(執行)」
能夠打開「Segment Advisor(段指導)」初始頁。必須從「comprehensive(綜合)」和 「limited(有限制)」分析模式中選擇一種。在綜合模式下,分析時間較長,由於指導會 對段進行採樣以肯定正確的目標。
一直單擊「Continue(繼續)」,回答指導的各個問題。你在「Segment Advisor: Review (段指導: 複查)」頁上結束操做,能夠在該頁上覆查分析內容的詳細資料。段指導分析 做爲調度做業運行,所以能夠從「Advisor Central(指導中心)」頁檢查已調度的任務。 完成後,能夠檢查指導的建議。
注:在段指導中,能夠指定分析操做的持續時間。這樣,能夠限制指導用於生成建議的時 間。通常說來,分析時段越長,獲得的結果就越全面。結果存儲在AWR 中,能夠稍後查 看。使用「Number of days to retain(保留天數)」選項能夠告知Oracle DB Server 這些結 果應在AWR 中保留多少天后再清除。
 
  • 實施建議
 
段指導完成其做業後,你能夠查看建議的詳細資料並直接實施建議。
注:在收縮按堆組織的表以前,必須在該表上啓用行移動功能。可使用「Edit Table (編輯表)」頁上「Options(選項)」選項卡中的「Database Control(數據庫控制)」 來進行此操做。
 
  • 自動段指導
• 由設置爲在默認維護窗口期間運行的調度程序做業啓動:
– 每一個工做日的晚上,星期一至星期五,從晚上10:00 至 第二天凌晨2:00
– 星期六和星期日,兩個窗口都開始於早上6:00,並持續 20 小時
• 檢查數據庫統計信息,對段數據採樣,而後選擇如下 對象進行分析:
– 超過了嚴重或警告閾值的表空間
– 包含活動最多的段
– 增加率最高的段
 
自動段指導
自動段指導是由配置爲在默認維護窗口期間運行的調度程序做業啓動的。默認維護窗口是 在調度程序中指定的,其初始定義以下:
• 每一個工做日的晚上,星期一至星期五,從晚上10:00 至第二天凌晨2:00(每晚4 小時)
• 週末,星期六和星期日早上6:00,天天持續20 小時
自動段指導不會分析每一個數據庫對象。而是檢查數據庫統計信息,對段數據採樣,而後選 擇如下對象進行分析:
• 超過了嚴重或警告空間閾值的表空間
• 包含活動最多的段
• 增加率最高的段
若是選擇了某個對象進行分析,但維護窗口在段指導能處理該對象以前失效了,則該對象 將在下一次自動段指導運行中分析。不能更改自動段指導選擇進行分析的那組表空間和段。
可是,能夠啓用或禁用自動段指導做業,更改自動段指導的計劃運行期間,或者調整自動 段指導的系統資源利用率。
 
  • 使用EM 手動收縮段
使用EM 手動收縮段
此外(相對於實施段指導的建議),還能夠收縮與特定數據庫對象關聯的各個段。例如, 在「Database(數據庫)」主頁中選擇「Schema(方案)」文件夾選項卡,而後單擊 「Database Objects(數據庫對象)」部分中的「Tables(表)」連接。在「Tables(表)」 頁上選擇表,接着在「Actions(操做)」下拉列表中選擇「Shrink Segment(收縮段)」。
而後單擊「Go(執行)」按鈕。這樣將打開「Shrink Segment(收縮段)」頁,你能夠在 其中選擇要收縮的從屬段。能夠選擇只壓縮空間,或者選擇壓縮並釋放空間。還能夠選擇 CASCADE選項。
完成後,單擊「Continue(繼續)」連接。這樣,收縮語句將做爲調度做業提交。
 
  • 使用SQL 收縮段
使用SQL 收縮段
由於在按堆組織的段中,收縮操做可能會致使ROWID發生更改,因此在該段上執行收縮 操做以前,必須在相應段上啓用行移動。默認狀況下,在段級別上行移動處於禁用狀態。
要啓用行移動,須要使用CREATE TABLE或ALTER TABLE命令的ENABLE ROW  MOVEMENT子句。第一個示例對此進行了闡述。
使用ALTER命令能夠針對對象調用段收縮。對象能夠是下列類型之一:表(按堆組織的 表或索引表)、分區、子分區、LOB(數據和索引段)、索引、實體化視圖或實體化視圖 日誌。
使用SHRINK SPACE子句能夠收縮段中的空間。若是指定了CASCADE,則收縮行爲將 級聯到全部支持收縮操做的從屬段,但實體化視圖、LOB 索引和IOT(索引表)映射表 例外。第二個示例展現了SHRINK SPACE子句。
在索引段中,收縮操做將首先合併索引,而後壓縮數據。 示例3 顯示了一個收縮LOB 段的命令,並假設RESUME列爲CLOB。
示例4 顯示了一個收縮IOT 溢出段的命令,此段屬於EMPLOYEES表。
  • 管理可恢復的空間分配
可恢復的語句有下列特性:
• 使用可恢復的語句,能夠掛起大型操做,而不是收到 錯誤
• 使用可恢復的語句,當操做掛起時,你能夠解決問題, 而後繼續進行,無須從新開始
• 在下列條件下,可恢復的語句將掛起:
– 空間不足
– 達到了最大區數
– 超出了空間限額
• 可恢復的語句能夠屢次掛起和恢復
 
管理可恢復的空間分配
Oracle DB Server 提供了一種方法,能夠在空間分配失敗時掛起大型數據庫操做,稍後再 恢復執行。使用這種方法,就有機會採起更正措施,而不是讓Oracle DB Server 向用戶返 回錯誤。更正了錯誤條件後,掛起的操做將自動恢復。這種功能稱爲「可恢復的空間分 配」。受影響的語句稱爲「可恢復的語句」。僅當爲系統或會話啓用了可恢復的語句功能 時,語句才能在可恢復模式下執行。
掛起語句時將自動掛起事務處理。所以在SQL 語句的掛起和恢復過程當中,將保留全部事 務處理資源。錯誤條件再也不存在時(例如在用戶干預以後,或者極可能在其它查詢釋放了 排序空間以後),掛起的語句將自動恢復執行。出現下列條件之一時,可恢復的語句將 掛起:
• 空間不足條件
• 達到了最大區數條件
• 超出了空間限額條件
可恢復的語句有一個與之關聯的掛起超時間隔。可恢復的語句的掛起時間超過超時間隔 (默認爲2 小時)後將從新激活自身,並向用戶返回異常錯誤。可恢復的語句能夠屢次 掛起和恢復。
注:達到最大區數錯誤僅發生在字典管理的表空間中。
 
  • 使用可恢復的空間分配
• 若是查詢、DML 操做和特定DDL 操做遇到空間不足 錯誤,則可恢復這些操做。
• 能夠經過SQL、PL/SQL、SQL*Loader 和數據泵實用 程序或Oracle 調用接口(OCI) 來發出可恢復的語句。
• 僅當某條語句的會話已由下列操做之一啓用時,該語句 才能夠在可恢復模式下執行:
– RESUMABLE_TIMEOUT初始化參數被設置爲非零值。
– 發出了ALTER SESSION ENABLE RESUMABLE語句:
ALTER SESSION ENABLE RESUMABLE;
INSERT INTO sales_new SELECT * FROM sh.sales;
ALTER SESSION DISABLE RESUMABLE; 
 
使用可恢復的空間分配
僅當在啓用了可恢復模式的會話中執行語句時,才能使用可恢復的空間分配。有兩種方法 能夠啓用和禁用可恢復的空間分配:
• 發出ALTER SESSION ENABLE RESUMABLE命令。
• 使用ALTER SESSION或ALTER SYSTEM語句,將RESUMABLE_TIMEOUT初始化 參數設置爲非零值。
在爲會話或數據庫啓用可恢復模式時,能夠指定一個超時時段,在此時段後,若是未發生 任何干預,則掛起的語句將出錯。RESUMABLE_TIMEOUT初始化參數指示超時發生以前 通過的秒數。也能夠用如下命令來指定超時時段:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;
TIMEOUT值一直有效,直到另外一個ALTER SESSION ENABLE RESUMABLE語句更改 該值,或使用另外一種方式更改該值,或直到會話結束。使用ENABLE RESUMABLE TIMEOUT子句啓用可恢復模式時的默認超時間隔是7,200 秒(2 小時)。
還能夠爲可恢復的語句命名。例如:
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600
NAME 'multitab insert';
 
語句的名稱用於在DBA_RESUMABLE和USER_RESUMABLE視圖中標識可恢復的語句。
例如:
SELECT name, sql_text FROM user_resumable;
NAME SQL_TEXT
--------------- --------------------------------------------
multitab insert INSERT INTO oldsales SELECT * FROM sh.sales;
要自動爲各個會話配置可恢復的語句設置,能夠建立並註冊一個數據庫級別的LOGON觸 發器,以更改用戶的會話。此觸發器能夠發出命令來爲會話啓用可恢復的語句,指定超時 時段,以及將會話發出的可恢復語句與某個名稱關聯。
由於掛起的語句會保留一些系統資源,因此必須先向用戶授予RESUMABLE系統權限,然 後他們才能啓用可恢復的空間分配並執行可恢復的語句。
 
  • 恢復掛起的語句
 
 
示例
1.INSERT語句遇到錯誤,聲稱表已滿。
2.掛起INSERT語句,而且不向客戶機傳遞任何錯誤。
3.或者,執行一個AFTER SUSPEND觸發器。
4.或者,激活SQLERROR異常錯誤以停止語句。
5.若是語句未停止,並將空閒空間成功添加到表中,則INSERT語句將恢復執行。
 
檢測掛起的語句
可恢復的語句掛起時,不會向客戶機發出錯誤。爲了方便採起更正措施,Oracle DB Server  提供了無需向用戶通知錯誤,也無需提供有關狀況的信息的替代方法。
 
在掛起期間可能執行的操做
可恢復的語句遇到可更正的錯誤時,系統將在內部生成AFTER SUSPEND系統事件。用戶 能夠在數據庫級別和方案級別同時爲此事件註冊觸發器。若是用戶註冊一個觸發器來處理 此係統事件,則在SQL 語句掛起後將執行該觸發器。在AFTER SUSPEND觸發器內執行 的SQL 語句始終不可恢復,而且始終是獨立運行的。在觸發器內啓動的事務處理使用 SYSTEM回退段。限定這些條件是爲了克服死鎖,並下降觸發器與語句遇到相同錯誤條件 的機率。
在觸發器代碼中,可使用USER_RESUMABLE視圖或DBA_RESUMABLE視圖,或者使用 DBMS_RESUMABLE.SPACE_ERROR_INFO函數來得到有關可恢復語句的信息。
當可恢復的語句掛起時:
• 調用語句的會話將被置於等待狀態。對於EVENT列包含「statement suspended,  wait error to be cleared」的會話,系統會將一個行插入V$SESSION_WAIT。
• 針對須要添加資源才能完成掛起語句的對象發出操做掛起的預警。
 
結束掛起的語句
解決了錯誤條件後(例如在DBA 干預以後,或者極可能在其它查詢釋放了排序空間之 後),掛起的語句將自動恢復執行,而且清除「可恢復會話已掛起」預警。
可使用DBMS_RESUMABLE.ABORT()過程強制掛起的語句激活SERVERERROR異常錯 誤。此過程能夠由DBA 調用,也能夠由發出語句的用戶調用。若是達到了與可恢復語句 關聯的掛起超時間隔,則語句將自動停止而且系統會向用戶返回錯誤。
 
  • 哪些操做是可恢復的
 
下列操做是可恢復的操做:
• 查詢:運行時臨時空間不足(排序空間不足)的SELECT語句是可恢復執行的語句。
使用OCI 時,OCIStmtExecute()和OCIStmtFetch()調用也可恢復執行。
• DML:INSERT、UPDATE和DELETE語句是可恢復執行的語句。用於執行這些語句 的接口沒有影響;接口能夠是OCI、SQL、PL/SQL 或其它接口。此外,外部表中的 INSERT INTO ... SELECT也是可恢復的。
• DDL:下列語句是可恢復執行的操做:
- CREATE TABLE ... AS SELECT
- CREATE INDEX
- ALTER INDEX ... REBUILD
- ALTER TABLE ... MOVE PARTITION
- ALTER TABLE ... SPLIT PARTITION
- ALTER INDEX ... REBUILD PARTITION
- ALTER INDEX ... SPLIT PARTITION
- CREATE MATERIALIZED VIEW
 
  • 小結
 
• 介紹Oracle DB Server 如何自動管理空間
• 使用壓縮節省空間
• 主動監視和管理表空間的空間使用量
• 介紹Oracle DB 中的段的建立
• 控制延遲建立段
• 使用「段指導」
• 使用段收縮功能從表和索引中回收浪費的空間
• 管理可恢復的空間分配

 

來源:http://blog.csdn.net/rlhua/article/details/13431595算法

相關文章
相關標籤/搜索