自動段指導任務(Automatic Segment Advisor)

  • 2020 年 3 月 26 日
  • 筆記

概述

本文主要介紹自動段指導(Automatic Segment Advisor)任務的內容進行詳細介紹。

10g

段指導(Segment Advisor)

從Oracle 10g R2開始推出了段指導(Segment Advisor)功能,用於識別是否有可用回收空間的段和有很多行鏈接的對象,並提出如何消除這些段中的碎片及行鏈接的建議。

段指導(Segment Advisor)主要生成以下類型的建議:

・當段指導(Segment Advisor)發現某對象的高水位線 (High Water Mark 簡稱HWM)下  的空餘空間特別多時,會推薦online segment shrink;  如果該對象並不適合Shrink(如表不是定義在ASSM的表領域等),段指導會推薦在線重定義對象  (online table redefinition).例如:利用DBMS_REDEFINITION程式包。・當段指導(Segment Advisor)發現某對象的行鏈接數大於某個臨界值時,  會記錄下來作為通知內容。

段指導建議的生成級別

通過手動執行段指導(Segment Advisor),可以生成以下3種級別的指導建議: (利用DBMSADVISOR.CREATEOBJECT時,指定的OBJECT_TYPE)

1.段級別:  針對非分區表、分區表的分區以及子分區、索引等個別段對象生成指導建議。2.對象級別:  針對錶或索引等整個對象生成指導建議。例如對某分區表進行分析,  會對分區表的所有分區生成知道建議。另外通過EM運行還可以指定對象的所有的依賴對象(如索引等)。3.表空間級別  針對某表空間所有的段對象生成指導建議。

自動段指導(Automatic Segment Advisor)

自動段指導(Automatic Segment Advisor)功能是,在資料庫做成時會自動地做成調度作業【GATHERSTATSJOB】,通過預定義的維護窗口(Maintenance Windows)進行執行。

    WEEKNIGHT_WINDOW : 周一到周五 每天22:00開始 ~ 次日06:00結束。     WEEKEND_WINDOW   :周六和周日的全天

自動段指導的分析對象

自動段指導並不是針對所有的資料庫對象進行分析,而是分析資料庫的統計資訊、段數據的取樣,對以下的對象進行分析:

1.超過空間的 critical 或warning閾值的表空間。2.操作活動很多的段3.很高增長率的段

自動段指導的動作確認

和自動統計資訊收集一樣,自動段指導的相關動作可以通過視圖進行查看。 這裡不做詳細介紹,可參考【自動統計資訊收集的動作確認】一節。

手動執行段指導

以下是針對段級別進行手動執行段指導的例子.

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;  /

段指導的結果表示

可以通過以下方式查看段指導的結果:

Enterprise ManagerDBA_ADVISOR_* 視圖DBMS_SPACE.ASA_RECOMMENDATIONS 程式包

下面簡單列舉通過DBMSSPACE.ASARECOMMENDATIONS 程式包查看段指導的結果的方法:

SQL> desc dbms_spaceFUNCTION ASA_RECOMMENDATIONS RETURNS DBMS_SPACE  Argument Name                  Type                    In/Out Default?  ------------------------------ ----------------------- ------ --------  ALL_RUNS                       VARCHAR2                IN     DEFAULT  SHOW_MANUAL                    VARCHAR2                IN     DEFAULT  SHOW_FINDINGS                  VARCHAR2                IN     DEFAULTSQL> select tablespace_name, segment_name, segment_type,      recommendations, c1      from table(dbms_space.asa_recommendations('TRUE', 'TRUE', 'FALSE'));

參考: Database Administrator's Guide

>Automatic Segment Advisor Job >Using the Segment Advisor

11g & 12c

自動段指導(Automatic Segment Advisor)建議的拓展

從Oracle 11g R2開始,作為自動段指導(Automatic Segment Advisor)的一部分,追加了段壓縮指導(Compression advisor)功能。

因此,11gR2以後,自動段指導(Automatic Segment Advisor)功能主要可以生成以下類型的建議:

・當段指導(Segment Advisor)發現某對象的高水位線 (High Water Mark 簡稱HWM)下的  空餘空間特別多時,會推薦online segment shrink;  如果該對象並不適合Shrink(如表不是定義在ASSM的表領域等),  段指導會推薦在線重定義對象(online table redefinition).  例如:利用DBMS_REDEFINITION程式包。・當段指導(Segment Advisor)發現某對象的行鏈接數大於某個臨界值時,  會記錄下來作為通知內容。・當自動段指導(Segment Advisor)發現段可以  從高級行壓縮(Advanced row compression 11g版本也稱為OLTP壓縮)中受益時,  段指導會生成建議指導。(11gR2以後)

段壓縮指導(Compression advisor)

通過段壓縮指導(Compression advisor)功能,可以評估通過高級行壓縮(Advanced row compression以前的11g版本也稱為OLTP壓縮)方法對段進行壓縮時,能夠節省的空間大小。

段壓縮指導評估對象:

段壓縮指導評估對象一般為大小為10MB以上,並且擁有3個以上索引的表。  (除了上面的條件以外,還會根據其他一些內部演算法來決定評估對象)

段壓縮指導處理邏輯:

・段壓縮指導主要使用DBMS_COMPRESSION程式包進行壓縮的評估。  ・評估過程中,會建立以下2個內部臨時表。   DBMS_TABCOMP_TEMP_UNCMP   :默認包含99%的取樣塊。      DBMS_TABCOMP_TEMP_CMP    :包含通過壓縮後的DBMS_TABCOMP_TEMP_UNCMP。通過DBMS_TABCOMP_TEMP_UNCMP和 DBMS_TABCOMP_TEMP_CMP計算出壓縮比。・評估結束後,刪除2個臨時表。

手動運行段壓縮指導 可以通過以下的方法手動地運行段壓縮指導。

例:

sql> set serveroutput on  sql> declare  v_blkcnt_cmp pls_integer;  v_blkcnt_uncmp pls_integer;  v_row_cmp pls_integer;  v_row_uncmp pls_integer;  v_cmp_ratio number;  v_comptype_str varchar2(60);  begin  dbms_compression.get_compression_ratio(  scratchtbsname => upper('&ScratchTBS'),  ownname => user,  tabname => upper('&TableName'),  partname => NULL,  comptype => dbms_compression.comp_for_query_high,  blkcnt_cmp => v_blkcnt_cmp,  blkcnt_uncmp => v_blkcnt_uncmp,  row_cmp => v_row_cmp,  row_uncmp => v_row_uncmp,  cmp_ratio => v_cmp_ratio,  comptype_str => v_comptype_str, subset_numrows=>&num_rows );  dbms_output.put_line('Estimated Compression Ratio: '||to_char(v_cmp_ratio));  dbms_output.put_line('Blocks used by compressed sample: '||to_char(v_blkcnt_cmp));  dbms_output.put_line('Blocks used by uncompressed sample: '||to_char(v_blkcnt_uncmp));  end;  /

參考: Database Administrator's Guide

>Automatic Segment Advisor >Using the Segment Advisor