數(shù)據(jù)庫對象統(tǒng)計分析技術應用

字號:

ORACLE在執(zhí)行SQL時如果使用成本方式分析則所有的成本分析信息來源依靠于系統(tǒng)的統(tǒng)計分析表(DBA_TABLES、DBA_INDEXES、DBA_TAB_COLUMNS)數(shù)據(jù),如果說統(tǒng)計分析的數(shù)據(jù)是不準確的,那可能會使ORACLE分析出來的路徑執(zhí)行性能極差,所以統(tǒng)計分析數(shù)據(jù)是影響ORACLE性能極重要的信息。
    統(tǒng)計分析主要包括產(chǎn)生表及索引的統(tǒng)計信息
    表的統(tǒng)計信息主要包括表的行數(shù),每行的平均長度(字節(jié)),空閑塊,統(tǒng)計時間等信息
    索引的統(tǒng)計信息主要包括行數(shù)、層數(shù)、葉塊數(shù)、統(tǒng)計時間等信息。
    另外ORACLE還可以統(tǒng)計列及數(shù)據(jù)不對稱信息,9i還可以統(tǒng)計系統(tǒng)信息(CPU,I/O)
    ORACLE執(zhí)行成本分析時首先取出所應用表及索引的統(tǒng)計數(shù)據(jù)進行分析,其中數(shù)據(jù)行數(shù)是一個重要的參數(shù),因為ORACLE在分析表大小時行數(shù)為主要參數(shù),如果進行兩個表聯(lián)合時,ORACLE會通過分析表的大小,決定應用小表進行全表查詢,而大表執(zhí)行聯(lián)合查詢,這種性能明顯高于先大表進行全表掃描。索引的統(tǒng)計信息對分析也產(chǎn)生比較大的影響,如ORACLE通過統(tǒng)計可以分析產(chǎn)生多個索引的優(yōu)先級及索引的實用性來確定的索引策略。ORACLE還可以統(tǒng)計列及數(shù)據(jù)對稱信息以產(chǎn)生更精確的分析。如一個表有A字段的索引,其中A共有兩種值1和0,共10000條記錄,為0的記錄有10條,為1的記錄有9990條,這時如果沒有進行列數(shù)據(jù)不對稱的統(tǒng)計信息,那么ORACLE對A=0及A=1條件查詢都會進行索引,但實際應用對A=0的索引性能得到了很大的提高,而A=1的索引反而使性能下降。所以說索引特征值分析信息對應用索引產(chǎn)生重大影響,精確的信息使ORACLE不會使用不應該用的索引。
    實際分析
    zl_cbqc和zl_yhjbqk都沒有建立統(tǒng)計信息,執(zhí)行如下兩個SQL ORACLE將產(chǎn)生不同的執(zhí)行計劃。
    1 select * from dlyx.zl_cbqc b, dlyx.zl_yhjbqk a where a.qc_bh=b.qc_bh
    執(zhí)行計劃:
    SELECT STATEMENT, GOAL = CHOOSE
     NESTED LOOPS
     TABLE ACCESS FULL DLYX ZL_YHJBQK
     TABLE ACCESS BY INDEX ROWID DLYX ZL_CBQC
     INDEX UNIQUE SCAN DLYX 抄表區(qū)冊主鍵
    2 select * from dlyx.zl_yhjbqk a,dlyx.zl_cbqc b where a.qc_bh=b.qc_bh
    執(zhí)行計劃:
    SELECT STATEMENT, GOAL = CHOOSE
     NESTED LOOPS
     TABLE ACCESS FULL DLYX ZL_CBQC
    TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK
     INDEX RANGE SCAN DLYX 區(qū)冊索引
    在對兩個表進行了統(tǒng)計分析后
    3 select * from dlyx.zl_yhjbqk a,dlyx.zl_cbqc b where a.qc_bh=b.qc_bh
    執(zhí)行計劃:
    SELECT STATEMENT, GOAL = CHOOSE 159 72853 9689449
     HASH JOIN 159 72853 9689449
     TABLE ACCESS FULL DLYX ZL_CBQC 1 426 19596
     TABLE ACCESS FULL DLYX ZL_YHJBQK 157 72853 6338211
    4 select * from dlyx.zl_cbqc b,dlyx.zl_yhjbqk a where a.qc_bh=b.qc_bh
    執(zhí)行計劃:
    SELECT STATEMENT, GOAL = CHOOSE 159 72853 9689449
     HASH JOIN 159 72853 9689449
     TABLE ACCESS FULL DLYX ZL_CBQC 1 426 19596
     TABLE ACCESS FULL DLYX ZL_YHJBQK 157 72853 6338211從以上測試可以明顯看出ORACLE的分析結果
    第1條SQL與第2條SQL在沒有統(tǒng)計分析的信息下進行,ORACLE無法進行判斷,只能以規(guī)則方法進行分析,根據(jù)表的出現(xiàn)先后順序有明顯關系。
    第3條SQL與第4條SQL在有統(tǒng)計分析的信息下進行,ORACLE分析與表的出現(xiàn)先后順序無關,因為它已經(jīng)知道了表的數(shù)據(jù)量并且已經(jīng)確定返回的數(shù)據(jù)量基本上是兩個表所有的數(shù)據(jù),所以對表兩個表進行了HASH JOIN (同時取出兩個表的數(shù)據(jù)然后在內(nèi)存中進行聯(lián)合產(chǎn)生返回結果)。
    相關技術
    用analyze語句產(chǎn)生分析數(shù)據(jù)
    分析表:analyze table zl_yhjbqk estimate statistics sample 20 percent
    分析索引:analyze index用戶資料表主鍵compute statistics
    分析列:analyze table zl_yhjbqk compute statistics for columns hbs_bh
    分析索引列:analyze table zl_yhjbqk compute statistics for all indexed columns
    用sys.dbms_utility包分析數(shù)據(jù)
     分析數(shù)據(jù)庫(包括所有的用戶對象和系統(tǒng)對象):analyze_database
     分析用戶所有的對象(包括用戶方案內(nèi)的表、索引、簇):analyze_schema
    用sys.dbms_stats包處理分析數(shù)據(jù)
     分析數(shù)據(jù)庫(包括所有的用戶對象和系統(tǒng)對象):gather_database_stats
     分析用戶所有的對象(包括表、索引、簇):gather_schema_stats
    分析表:gather_table_stats
    分析索引:gather_index_stats
    刪除數(shù)據(jù)庫統(tǒng)計信息:delete_database_stats
    刪除用戶方案統(tǒng)計信息:delete_schema_stats
    刪除表統(tǒng)計信息:delete_table_stats
    刪除索引統(tǒng)計信息:delete_index_stats
    刪除列統(tǒng)計信息:delete_column_stats
    設置表統(tǒng)計信息:set_table_stats
    設置索引統(tǒng)計信息:set_index_stats
    設置列統(tǒng)計信息:set_column_stats
    ORACLE推薦用戶采用sys.dbms_stats包體進行分析,因為在ORACLE9i及其以上的版本全面擴充的此包體的功能。sys.dbms_utility包體進行分析時會對所有的信息全部分析一遍,時間比較長,而在9i中sys.dbms_stats可以利用表修改監(jiān)控技術來判斷需統(tǒng)計分析的表進行,節(jié)省了用戶的分析資源。
    備注:
     ORACLE在得到了表的統(tǒng)計分析數(shù)據(jù)后才會進行成本分析,否則采用規(guī)則分析。
     并不是所有的統(tǒng)計數(shù)據(jù)都會對ORACLE分析產(chǎn)生影響,有些統(tǒng)計數(shù)據(jù)ORACLE并不處理,只是提供給用戶一個參考信息,也可能在ORACLE以后的版本中利用這些信息進行分析。
     分析表的登錄用戶必須對表擁有訪問權限或具有DBA或Analyze any權限