溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解ORACLE表統(tǒng)計信息與列統(tǒng)計信息、索引統(tǒng)計信息

發(fā)布時間:2021-11-12 15:17:08 來源:億速云 閱讀:191 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

如何理解ORACLE表統(tǒng)計信息與列統(tǒng)計信息、索引統(tǒng)計信息,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

ORACLE表統(tǒng)計信息與列統(tǒng)計信息

我們在分析某些語句的性能時,會分析一些信息。像表、列、索引、直方圖等等,本篇主要講表與列、索引的統(tǒng)計信息收集與分析。

一、表統(tǒng)計信息

  1. 1. 表已創(chuàng)建,需要收集統(tǒng)計信息

  2. BEGIN

  3. DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '',

  4.                                 TABNAME => '',

  5.                                 ESTIMATE_PERCENT => 100,

  6.                                 METHOD_OPT => 'for all columns size skewonly',

  7.                                 CASCADE => TRUE);

  8. END;


 2. 查看表的統(tǒng)計信息用dba_tab_statistics。

  1. col OWNER for a16

  2. col table_name for a20

  3. col PARTITION_NAME for a18

  4. col OBJECT_TYPE for a12

  5. col LAST_ANALYZED for a20

  6. SELECT OWNER,TABLE_NAME,PARTITION_NAME,OBJECT_TYPE,NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN,to_char(LAST_ANALYZED,'yyyy-mm-dd hh34:mi:ss') LAST_ANALYZED,USER_STATS

  7.   FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'MSTB_ORDER_HEADER' ;


  8. OWNER            TABLE_NAME  PARTITION_NAME OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN LAST_ANALYZED USER_S
    ---------------- ----------- -------------- ------------ ---------- ---------- ------------ ---------- ---------- ----------- ------------- ------
    POS_ORDER        MSTB_ORDER_                TABLE          40445748    1928239            0          0          0         317 2016-01-07 17 NO
    POS_ORDER        MSTB_ORDER_ P_MAXVALUE     PARTITION             1         19            0          0          0         197 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2009_10  PARTITION             0          0            0          0          0           0 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2009_11  PARTITION             0          0            0          0          0           0 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2009_12  PARTITION             0          0            0          0          0           0 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_1   PARTITION             0          0            0          0          0           0 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_10  PARTITION         73496       3299            0          0          0         260 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_11  PARTITION         69908       3138            0          0          0         259 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_12  PARTITION         66918       3018            0          0          0         260 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_6   PARTITION         45502       1940            0          0          0         256 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_7   PARTITION         53236       2279            0          0          0         256 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_8   PARTITION         52568       2279            0          0          0         254 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2012_9   PARTITION         71614       3219            0          0          0         260 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2013_1   PARTITION         72958       3293            0          0          0         260 2016-01-07 16 NO
    POS_ORDER        MSTB_ORDER_ P_MOH_2013_10  PARTITION         75330       3449            0          0          0         261 2016-01-07 16 NO



  9. 關(guān)于每一列的解釋聯(lián)機文檔上都有(http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_2114.htm#REFRN20376)

  10. 這里blocks是高水位以下的數(shù)據(jù)塊數(shù),empty_blocks是高水位以上的數(shù)據(jù)塊數(shù)。

  11. Dbms_stats不計算EMPTY_BLOCKS、AVG_SPACE、CHAIN_CNT。可以使用ANALYZE收取(ANALYZE TABLE <tabname> COMPUTE STATISTICS)</tabname<>

  12. chain_cnt字段表示行遷移和行鏈接的數(shù)量信息.



二、列統(tǒng)計信息

  • COLUMN_NAME         NUM_DISTINCT LOW_VALUE       HIGH_VALUE          DENSITY  NUM_NULLS AVG_COL_LEN HISTOGRAM       NUM_BUCKETS
    ------------------- ------------ --------------- ---------------- ---------- ---------- ----------- --------------- -----------
    ORIGINAL_ORDER_PV           3707 80              C24C5F19          .00026976   40419026           2 NONE                      1
    RSVST3                         4 4230363235      4230363238              .25   40194414           2 NONE                      1
    INVOICE_FLAG                   2 80              C102             4.7902E-08   30012940           2 FREQUENCY                 2
    INVOICE_REPRINT                2 80              C102             1.7177E-07   37531990           2 FREQUENCY                 2
    POSWTO_FLAG                    1 80              80                        1          0           2 NONE                      1
    INVOICE_SALES_DATE           705 78720106010101  78730A1A010101   .002169197   32955696           3 HEIGHT BALANCED         254
    ORDER_SUM_QUANTITY          1400 C102            C4025A645B       .000714286    9823640           3 NONE                      1
    RECIEVABLE_AMOUNT          81810 3C1E2E5B66      C50A1C143415     .000844595          0           4 HEIGHT BALANCED         254
    ORDER_BV                  158632 3C640B66        C508590C3B35     6.3039E-06          0           4 NONE                      1
    ORDER_PV                  167806 3D582C5166      C4400707450B     5.9593E-06          0           4 NONE                      1
    SALE_DATE                   1293 78700206010101  78C70C04010101   .001996008          0           8 HEIGHT BALANCED         254
    REGION_CODE                    2 303530          333630           1.2352E-08          0           4 FREQUENCY                 2
    SHOP_CODE                    318 3031            6E756C6C          .00304878          0           5 HEIGHT BALANCED         254
    SHIPPING_WAREHOUSE           389 3031            5443305A         .002808989          0           5 HEIGHT BALANCED         254


  • 字段解釋,可參考聯(lián)機文檔(http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_2101.htm#REFRN20275)

    統(tǒng)計信息解釋一下:
    NUM_DISTINCT:該列中唯一值的數(shù)量。
    LOW_VALUE:該列的最小值。顯示為內(nèi)部存儲格式。對于字符串列,只存儲前32字節(jié)。
    HIGH_VALUE:該列的最大值。顯示為內(nèi)部存儲格式。對于字符串列,只存儲前32字節(jié)。
    DENSITY:0到1之間的一個小數(shù)。接近0表示對于該列的過濾操作能去掉大多數(shù)的行。接近1表示對于該列的過濾操作起不到什么作用。如果沒有直方圖,DENSITY=1/NUM_DISTINCT。
    HISTOGRAM:表明是否有直方圖信息,如果有,是什么類型?FREQUENCY表示頻率類型,HEIGHT BALANCED表示平均分布類型;如果沒有,則為NONE。
    NUM_BUCKETS:直方圖里的桶數(shù)。它表示一組同類的數(shù)值放在一起。直方圖最少由一個桶組成。如果沒有直方圖,則為1,最大桶數(shù)為254。

    這里的LOW_VALUE和HIGH_VALUE都是內(nèi)部格式,所以必須轉(zhuǎn)換為可讀懂的格式,有兩種方法。

    1)使用工具包utl_raw提供的函數(shù)cast_to_binary_double、cast_to_binary_float、cast_to_binary_integer、cast_to_number、cast_to_nvarchar2、cast_to_raw和cast_to_varchar2。這些函數(shù)就是把內(nèi)部存儲格式轉(zhuǎn)換為實際值。

    SELECT UTL_RAW.CAST_TO_NUMBER(LOW_VALUE), UTL_RAW.CAST_TO_NUMBER(HIGH_VALUE) 
      FROM DBA_TAB_COL_STATISTICS
     WHERE TABLE_NAME = 'MSTB_ORDER_HEADER'
      AND COLUMN_NAME = 'GROUP_ORDER_ID';

    UTL_RAW.CAST_TO_NUMBER(LOW_VALUE) UTL_RAW.CAST_TO_NUMBER(HIGH_VALUE)
    --------------------------------- ----------------------------------
                                    0                            7821636

    2) 使用dbms_stats提供的過程convert_raw_value、convert_raw_value_nvarchar和convert_raw_value_rowid。該過程不能直接在SQL語句中使用,通常只用于PL/SQL程序中。

    DECLARE
      L_LOW_VALUE  DBA_TAB_COL_STATISTICS.LOW_VALUE%TYPE;
      L_HIGH_VALUE DBA_TAB_COL_STATISTICS.HIGH_VALUE%TYPE;
      L_VAL1       T.VAL1%TYPE;
    BEGIN
      SELECT LOW_VALUE, HIGH_VALUE
        INTO L_LOW_VALUE, L_HIGH_VALUE
        FROM DBA_TAB_COL_STATISTICS
     WHERE TABLE_NAME = 'MSTB_ORDER_HEADER'
      AND COLUMN_NAME = 'GROUP_ORDER_ID';

      DBMS_STATS.CONVERT_RAW_VALUE(L_LOW_VALUE, L_VAL1);
      DBMS_OUTPUT.PUT_LINE('low_value: ' || L_VAL1);
      DBMS_STATS.CONVERT_RAW_VALUE(L_HIGH_VALUE, L_VAL1);
      DBMS_OUTPUT.PUT_LINE('high_value: ' || L_VAL1);
    END;
    /

    UTL_RAW.CAST_TO_NUMBER(LOW_VALUE) UTL_RAW.CAST_TO_NUMBER(HIGH_VALUE)
    --------------------------------- ----------------------------------
                                    0                            7821636

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI