登陸註冊數據庫
原創 做者:尛樣兒 時間:2015-08-08 14:52:44 7917 0性能優化
ONLINE TABLE REDEFINITION(在線重定義表)(詳見:《使用DBMS_REDEFINITION包執行在線重定義表(ONLINE TABLE REDEFINITION) 》:http://blog.itpub.net/23135684/viewspace-1765128/)也能夠完成數據空間的回收,可是ONLINE SEGMENT SHRINK更合適單純的表空間回收,這篇文章將根據官方文檔的內容討論經過在線段收縮回收浪費的空間。
一.回收未使用空間的原理
隨着時間的推移,針對表空間下對象的UPDATE和DELETE操做會產生個別空的空間,這些空間不是足夠的大,沒辦法被新插入的數據使用。這種類型的空空間被認爲是自由空間的碎片。
擁有自由空間碎片的對象存在空間的浪費,也會影響數據庫的性能。首選的碎片整理和空間的回收方法是執行在線段收縮(online segment shrink),這個過程會將高水位線如下的自由空間的碎片整合到一塊兒,把段壓緊,壓緊以後,高水位線能夠移動,最終的結果是新的自由空間在高水位線以上,高水位線以上的空間以後會回收(deallocated),在整個在線段回收的操做過程當中段仍然能夠被查詢和執行DML操做,而且沒有額外的磁盤空間須要被分配。
使用Segment Advisor標示段是在線段回收的優點,只有段屬於本地表空間管理和ASSM纔是可行的。
若是段不符合在線段回收的要求,或者你想在回收空間的過程當中改變表的邏輯或者物理屬性,可使用在線表重定義的方式來實現段的空間回收。在線重定義被認爲是從新對錶的組織,和在線段回收不一樣,它要求分配額外的磁盤空間。
注意:SHRINK和DEALLOCATE兩個操做是有區別的,SHRINK是碎片整理,DEALLOCATE是下降高水位線,下面會對這兩個的區別進一步的說明。
二.Segment Advisor
Segment Advisor用來鑑別Segment空間回收是不是可行的。它經過檢查使用狀況,在AWR中的增加統計信息,以及段中的樣例數據來進行分析。Segment Advisor被配置成在維護窗口期間自動運行的維護任務,固然也能夠手動運行它。Segment Advisor自動維護認爲被叫作Automatic Segment Advisor。
Segment Advisor生成如下的建議:
1).Segment Advisor決定一個對象是否有重大的自由空間,推薦執行在線段SHRINK。若是對象對應的表不符合回收條件,Segment Advisor推薦在線表重定義。
2).Segment Advisor決定表能從壓縮或者OLTP壓縮中得到優點,推薦使用這種方法。
3).Segment Advisor遇到表row chain超過閥值,它記錄表大量chain row這種狀況。
若是收到空間管理告警,或者你想回收空間,應該從Segment Advisor開始。
Automatic Segment Advisor不是分析數據庫的每個對象,而是審查數據庫統計信息,段數據採樣,而後選擇一下的對象進行分析:
>表空間超過臨界點,或者空間閥值告警。
>最活躍的段。
>最高增加率的段。
Segment Advisor也手動的調用,能夠經過OEM和DBMS_ADVISOR包進行調用。這裏咱們討論經過DBMS_ADVISOR進行調用的方法。
使用DBMS_ADVISOR包的存儲過程建立Segment Advisor工做,設置工做的屬性,而後執行這個工做。使用此包必須有ADVISOR的權限。
下面經過一個例子來討論經過DBMS_ADVISOR手動調用Segment Advisor的方法,用戶執行DBMS_ADVISOR包的存儲過程必須用此包的EXECUTE對象權限,或者ADVISOR系統權限。
注意:若是經過DBMS_ADVISOR.CREATE_OBJECT對錶進行操做,若是表是一個分區表,Segment Advisor分析表的全部分區,針對每一個分區生成單獨的findings和推薦。
variable id number;
begin
declare
name varchar2(100);
descr varchar2(500);
obj_id number;
begin
name:='Manual_Employees';
descr:='Segment Advisor Example';
dbms_advisor.create_task (
advisor_name => 'Segment Advisor',
task_id => :id,
task_name => name,
task_desc => descr);
dbms_advisor.create_object (
task_name => name,
object_type => 'TABLE',
attr1 => 'HR',
attr2 => 'EMPLOYEES',
attr3 => NULL,
attr4 => NULL,
attr5 => NULL,
object_id => obj_id);
dbms_advisor.set_task_parameter(
task_name => name,
parameter => 'recommend_all',
value => 'TRUE');
dbms_advisor.execute_task(name);
end;
end;
/
查看Segment Advisor的結果
Segment Advisor建立了幾種類型的結果,recommendations,findings,actions和objects。
方法1:經過DBMS_SPACE.ASA_RECOMMENDATIONS查看結果。
這是一種最簡單的方法。
select tablespace_name, segment_name, segment_type, partition_name,
recommendations, c1 from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));
TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE
------------------------------ ------------------------------ --------------
PARTITION_NAME
------------------------------
RECOMMENDATIONS
-----------------------------------------------------------------------------
C1
-----------------------------------------------------------------------------
TVMDS_ASSM ORDERS1 TABLE PARTITION
ORDERS1_P2
Perform shrink, estimated savings is 57666422 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P2" shrink space
TVMDS_ASSM ORDERS1 TABLE PARTITION
ORDERS1_P1
Perform shrink, estimated savings is 45083514 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P1" shrink space
TVMDS_ASSM_NEW ORDERS_NEW TABLE
Perform shrink, estimated savings is 155398992 bytes.
alter table "STEVE"."ORDERS_NEW" shrink space
TVMDS_ASSM_NEW ORDERS_NEW_INDEX INDEX
Perform shrink, estimated savings is 102759445 bytes.
alter index "STEVE"."ORDERS_NEW_INDEX" shrink space
方法2:經過查詢DBA_ADVISOR_*視圖能夠得到結果。
在查詢DBA_ADVISOR_*視圖以前,能夠經過查詢DBA_ADVISOR_TASKS.STATUS字段確保Segment Advisor工做已經結束。
select task_name, status from dba_advisor_tasks
where owner = 'STEVE' and advisor_name = 'Segment Advisor';
TASK_NAME STATUS
------------------------------ -----------
Manual Employees COMPLETED
如下的例子說明如何查詢DBA_ADVISOR_*視圖從全部運行的Segment Advisor中檢索經過STEVE用戶提交的工做:
select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message
from dba_advisor_findings af, dba_advisor_objects ao
where ao.task_id = af.task_id
and ao.object_id = af.object_id
and ao.owner = 'STEVE';
TASK_NAME SEGNAME PARTITION TYPE MESSAGE
------------------ ------------ --------------- ---------------- --------------------------
Manual_Employees EMPLOYEES TABLE The free space in the obje
ct is less than 10MB.
Manual_Salestable4 SALESTABLE4 SALESTABLE4_P1 TABLE PARTITION Perform shrink, estimated
savings is 74444154 bytes.
Manual_Salestable4 SALESTABLE4 SALESTABLE4_P2 TABLE PARTITION The free space in the obje
ct is less than 10MB.
三.在線段空間SHRINK
段SHRINK是在線的,內部操做。在段SHRINK階段數據的移動不會影響DML操做和查詢操做。並行的DML操做在SHRINK操做結束,空間deallocated的時候會被短期的阻塞。在SHRINK操做期間索引會被維護,操做完成後仍然是可用的。Segment SHRINK不要求額外的空間分配。
Segment SHRINK高水位線以上和如下未使用的空間,相比較,空間deallocation只回收高水位線以上的空間。在回收操做中,默認狀況下,數據庫壓緊段,調整高水位線,釋放浪費的空間。
Segment Shrink要求行被移動到新的位置,所以必須在你想要shrink的獨享上首先啓用行遷移,和禁用在對象上基於rowid的觸發器定義。經過ALTER TABLE ... ENABLE ROW MOVEMENT語句啓用行遷移。
shrink只支持本地化表空間管理和ASMM管理的表空間下的表。
能夠在表,IOT表,索引,分區,子分區,物化視圖,物化視圖日誌上shrink空間。
若是表上有基於函數的索引,那麼將沒法對錶進行shrink操做(CASCADE和NOCASCADE都不行)。
兩個shrink字句用於控制如何來shrink操做:
>COMPACT劃分SHRINK段操做到兩個階段,當你指定COMPACT,Oracle數據庫整理段空間碎片,壓緊錶行,可是從新設置高水位線和deallocation空間會被延期。這個對長時間運行的查詢可能讀取被回收的塊來講是有用的。這個碎片整理和壓緊的結果會被保留到磁盤,以後能夠再次以沒有COMPACT字句的命令執行SHRINK SPACE語句。
>CASCADE字句延伸段shrink操做到全部依賴段的對象,例如,當SHRINK表段的時候指定CASCADE,表相關的全部索引將被SHRINK(不須要在SHRINK分區表的分區的時候指定CASCADE),能夠運行DBMS_SPACE.OBJECT_DEPENDENT_SEGMENTS存儲過程來查看依賴段的全部對象。
若是不指定COMPAT字句,執行段SHRINK以後的SQL語句都將由於失效的遊標被從新的解析,由於這是個DDL操做。
例子:
>Shrink表和全部依賴它的段:(包括BASICFILE LOB段):
ALTER TABLE employees SHRINK SPACE CASCADE;
>只Shrink BASICFILE LOB段:
ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);
>Shrink分區表的單一分區:
ALTER TABLE customers MODIFY PARTITION cust_P1 SHRINK SPACE;
>Shrink IOT索引段和overflow段:
ALTER TABLE cities SHRINK SPACE CASCADE;
>只SHRINK IOT overflow段:
ALTER TABLE cities OVERFLOW SHRINK SPACE;
四.Deallocate未使用的空間
當執行deallocate未使用的空間,數據庫使得數據庫段結尾以後未使用的空間變得可用(下降高水位線),注意,在對錶作SHRINK以後高水位線默認會被下降,DEALLOCATE用於未執行SHRINK或者,非默認的SHRINK時使用。
執行deallocation以前,能夠運行DBMS_SPACE.UNUSED_SPACE過程將返回高水位線位置信息,和段空間未使用空間的總數。對於本地化和段自動化管理的表空間,SPACE_USAGE能夠得到更準確的數據。
如下的語句deallocate段未使用的空間(表,索引或者cluster):
ALTER TABLE table DEALLOCATE UNUSED KEEP <integer>;
ALTER INDEX index DEALLOCATE UNUSED KEEP <integer>;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP <integer>;
KEEP是可選的字句,指定段保留的空間總數,能夠經過檢查DBA_FREE_SPACE視圖驗證DEALLOCATED爲自由的空間。
相關文章:
《Moving表到新的段或者表空間》:http://blog.itpub.net/23135684/viewspace-1766480/
--end--
less
0函數
0性能
分享到:優化
上一篇: 使用DBMS_REDEFINITION包執行在線重定義表(ONLINE TABLE REDEFINITION)spa
下一篇: Moving表到新的段或者表空間.net
請登陸後發表評論日誌
所有評論
Oracle數據庫管理員,Oracle數據庫系統構架員;2012年7月出版《構建最高可用Oracle數據庫系統:Oracle 11gR2 RAC管理、維護與性能優化》一書;Oracle 10g OCM。