ORACLE的統計分析


統計分析主要包括產生表及索引的統計信息

表的統計信息主要包括表的行數,每行的平均長度(字節),空閑塊,統計時間等信息
索引的統計信息主要包括行數、層數、葉塊數、統計時間等信息。
另外ORACLE還可以統計列及數據不對稱信息,9i還可以統計系統信息(CPU,I/O)

ORACLE執行成本分析時首先取出所應用表及索引的統計數據進行分析,其中數據行數是一個重要的參數,因為ORACLE 在分析表大小時行數為主要參數,如果進行兩個表聯合時,ORACLE會通過分析表的大小,決定應用小表進行全表查詢,而大表執行聯合查詢,這種性能明顯高 於先大表進行全表掃描。索引的統計信息對分析也產生比較大的影響,如ORACLE通過統計可以分析產生多個索引的優先級及索引的實用性來確定最優的索引策 略。ORACLE還可以統計列及數據對稱信息以產生更精確的分析。如一個表有A字段的索引,其中A共有兩種值1和0,共10000條記錄,為0的記錄有 10條,為1的記錄有9990條,這時如果沒有進行列數據不對稱的統計信息,那么ORACLE對A=0及A=1條件查詢都會進行索引,但實際應用對A=0 的索引性能得到了很大的提高,而A=1的索引反而使性能下降。所以說索引特征值分析信息對應用索引產生重大影響,精確的信息使ORACLE不會使用不應該 用的索引。

實際分析:
zl_cbqc和zl_yhjbqk都沒有建立統計信息,執行如下兩個SQL ORACLE將產生不同的執行計划。

1. select * from dlyx.zl_cbqc  b, dlyx.zl_yhjbqk  a where a.qc_bh=b.qc_bh

執行計划:

SELECT STATEMENT, GOAL = CHOOSE                             

NESTED LOOPS                            

TABLE ACCESS FULL   DLYX     ZL_YHJBQK  

TABLE ACCESS BY INDEX ROWID      DLYX     ZL_CBQC                   

INDEX UNIQUE SCAN DLYX                         


2. select * from dlyx.zl_yhjbqk a,dlyx.zl_cbqc b where a.qc_bh=b.qc_bh

執行計划:

SELECT STATEMENT, GOAL = CHOOSE                             

NESTED LOOPS                            

TABLE ACCESS FULL    DLYX     ZL_CBQC                  

TABLE ACCESS BY INDEX ROWID      DLYX     ZL_YHJBQK                

 INDEX RANGE SCAN    DLYX                        

在對兩個表進行了統計分析后

3. select * from dlyx.zl_yhjbqk a,dlyx.zl_cbqc b where a.qc_bh=b.qc_bh

執行計划:

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

執行計划:

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在沒有統計分析的信息下進行,ORACLE無法進行判斷,只能以規則方法進行分析,根據表的出現先后順序有明顯關系。

第3條SQL與第4條SQL在有統計分析的信息下進行,ORACLE分析與表的出現先后順序無關,因為它已經知道了 表的數據量並且已經確定返回的數據量基本上是兩個表所有的數據,所以對表兩個表進行了HASH JOIN (同時取出兩個表的數據然后在內存中進行聯合產生返回結果)。


    ORACLE數據庫的PL/SQL語句執行的優化器,有基於代價的優化器(CBO)和基於規則的優化器(RBO)。

    RBO的優化方式,依賴於一套嚴格的語法規則,只要按照規則寫出的語句,不管數據表和索引的內容是否發生變化,不會影響PL/SQL語句的"執行計划"。

    CBO自ORACLE7版被引入,ORACLE自7版以來采用的許多新技術都是只基於CBO的,如星型連接排列查詢,哈希連接查詢,反向索引,索引表,分 區表和並行查詢等。CBO計算各種可能"執行計划"的"代價",即cost,從中選用cost最低的方案,作為實際運行方案。各"執行計划"的cost的 計算根據,依賴於數據表中數據的統計分布,ORACLE數據庫本身對該統計分布是不清楚的,須要分析表和相關的索引,才能搜集到CBO所需的數據。

    CBO是ORACLE推薦使用的優化方式,要想使用好CBO,使SQL語句發揮最大效能,必須保證統計數據的及時性。

    統計信息的生成可以有完全計算法和抽樣估算法。SQL例句如下:

    完全計算法: analyze table abc compute statistics; 
    抽樣估算法(抽樣20%): analyze table abc estimate statistics sample 20 percent;

    對表作完全計算所花的時間相當於做全表掃描,抽樣估算法由於采用抽樣,比完全計算法的生成統計速度要快,如果不是要求要有精確數據的話,盡量采用抽樣分析法。建議對表分析采用抽樣估算,對索引分析可以采用完全計算。

    我們可以采用以下兩種方法,對數據庫的表和索引及簇表定期分析生成統計信息,保證應用的正常性能。

    1. 在系統設置定時任務,執行分析腳本。

    在數據庫服務器端,我們以UNIX用戶oracle,運行腳本analyze,在analyze中,我們生成待執行sql腳本,並運行。(假設我們要分析scott用戶下的所有表和索引)

    Analyze腳本內容如下:

sqlplus scott/tiger << EOF
    set pagesize 5000
    set heading off
    SPOOL ANALYTAB.SQL
    SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT ;" FROM USER_TABLES;
    SPOOL OFF
    SPOOL ANALYIND.SQL
    SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT FOR ALL INDEXES;" FROM USER_TABLES;
    SPOOL OFF
    SPOOL ANALYZE.LOG
    @ANALYTAB.SQL
    @ANALYIND.SQL
    SPOOL OFF
    EXIT

    在UNIX平台上crontab加入,以上文件,設置為每個月或合適的時間段運行。

或者將如下腳本保存成analyze.sql,然后在sqlplus里面執行:

set pagesize 5000
set linesize 300
set trims on
set heading off
set feedback off
SPOOL analyTab.sql
SELECT 'ANALYZE TABLE ZFMI.'||TABLE_NAME||' COMPUTE STATISTICS ;'

FROM USER_TABLES;
SPOOL OFF
SPOOL analyIdx.sql
SELECT 'ANALYZE TABLE ZFMI.'||TABLE_NAME||' COMPUTE STATISTICS

FOR ALL INDEXES;' FROM USER_TABLES;
SPOOL OFF
SPOOL analyLog.log
@@analyTab.sql
@@analyIdx.sql
SPOOL OFF

    2. 利用ORACLE提供的程序包(PACKAGE)對相關的數據庫對象進行分析。

    有以下的程序包可以對表,索引,簇表進行分析。

    包中的存儲過程的相關參數解釋如下:

    TYPE可以是:TABLE,INDEX,CLUSTER中其一。 
    SCHEMA為:TABLE,INDEX,CLUSTER的所有者,NULL為當前用戶。 
    NAME為:相關對象的名稱。 
    METHOD是:ESTIMATE,COMPUTE,DELETE中其一,當選用ESTIMATE, 
    下面兩項,ESTIMATE_ROWS和ESTIMATE_PERCENT不能同時為空值。 
    ESTIMATE_ROWS是:估算的抽樣行數。 
    ESTIMATE_PERCENT是:估算的抽樣百分比。 
    METHOD_OPT是:有以下選項, 
    FOR TABLE /*只統計表*/ 
    [FOR ALL [INDEXED] COLUMNS] [SIZE N] /*只統計有索引的表列*/ 
    FOR ALL INDEXES /*只分析統計相關索引*/ 
    PARTNAME是:指定要分析的分區名稱。

    1)

    DBMS_DDL.ANALYZE_OBJECT( 
    TYPE VARCHAR2, 
    SCHEMA VARCHAR2, 
    NAME VARCHAR2, 
    METHOD VARCHAR2, 
    ESTIMATE_ROWS NUMBER DEFAULT NULL, 
    ESTIMATE_PERCENT NUMBER DEFAULT NULL, 
    METHOD_OPT VARCHAR2 DEFAULT NULL, 
    PARTNAME VARCHAR2 DEFAULT NULL ) ;

    該存儲過程可對特定的表,索引和簇表進行分析。例如,對SCOTT用戶的EMP表,進行50%的抽樣分析,參數如下:

    DBMS_DDL.ANALYZE_OBJECT("TABLE", "SCOTT", "EMP", "ESTIMATE", NULL,50);

    2)

    DBMS_UTILITY.ANALYZE_SCHEMA ( 
    SCHEMA VARCHAR2, 
    METHOD VARCHAR2, 
    ESTIMATE_ROWS NUMBER DEFAULT NULL, 
    ESTIMATE_PERCENT NUMBER DEFAULT NULL, 
    METHOD_OPT VARCHAR2 DEFAULT NULL ) ; 
    DBMS_UTILITY.ANALYZE_DATABASE ( 
    METHOD VARCHAR2, 
    ESTIMATE_ROWS NUMBER DEFAULT NULL, 
    ESTIMATE_PERCENT NUMBER DEFAULT NULL, 
    METHOD_OPT VARCHAR2 DEFAULT NULL );

    其中,ANALYZE_SCHEMA用於對某個用戶擁有的所有TABLE,INDEX和CLUSTER的分析統計。ANALYZE_DATABASE用於對整個數據庫進行分析統計。

    3) DBMS_STATS是在ORACLE8I中新增的程序包,它使統計數據的生成和處理更加靈活方便,並且可以並行方式生成統計數據。在程序包中的以下過程分別分析統計TABLE,INDEX,SCHEMA,DATABASE級別的信息。

    DBMS_STATS.GATHER_TABLE_STATS 
    DBMS_STATS.GATHER_INDEX_STATS 
    DBMS_STATS.GATHER_SCHEMA_STATS 
    DBMS_STATS.GATHER_DATABASE_STATS

    在這里,我們以數據庫JOB的方式,定時對數據庫中SCOTT模式下所有的表和索引進行分析:

    在SQL*PLUS下運行:

    VARIABLE jobno number;
    
BEGIN
    DBMS_JOBS.SUBMIT ( :jobno ,
    " dbms_utility.analyze_schema ( "scott", "estimate", 
NULL20) ; ",
    sysdate, "sysdate
+30");
    
commit;
    
end;
    
/
    Statement processed.
    
Print jobno
    JOBNO
    
------------- 
    16

    以上作業,每隔一個月用DBMS_UTILITY.ANALYZE_SCHEMA對用戶SCOTT的所有表,簇表和索引作統計分析。

dbms_stats包問世以后,Oracle專家可通過一種簡單的方式來為CBO收集統計數據。目前,已經不再推薦你使用老式的分析表和 dbms_utility方法來生成CBO統計數據。那些古老的方式甚至有可能危及 SQL的性能,因為它們並非總是能夠捕捉到有關表和索引的高質量信息。 CBO使用對象統計,為所有SQL語句選擇最佳的執行計划。

dbms_stats能良好地估計統計數據(尤其是針對較大的分區表),並能獲得更好的統計結果,最終制定出速度更快的SQL執行計划。


下邊給出了dbms_stats的一次示范執行情況,其中使用了options子句。

execdbms_stats.gather_schema_stats( -
ownname => 'SCOTT', -
options => 'GATHER AUTO', -
estimate_percent => dbms_stats.auto_sample_size, -
method_opt => 'for all columns size repeat', -
degree => 15 -
)

為了充分認識dbms_stats的好處,你需要仔細體會每一條主要的預編譯指令(directive)。下面讓我們研究每一條指令,並體會如何用它為基於代價的SQL優化器收集最高質量的統計數據。

options參數
使用4個預設的方法之一,這個選項能控制Oracle統計的刷新方式:

gather——重新分析整個架構(Schema)。
gather empty——只分析目前還沒有統計的表。
gather stale——只重新分析修改量超過10%的表(這些修改包括插入、更新和刪除)。
gather auto——重新分析當前沒有統計的對象,以及統計數據過期(變臟)的對象。注意,使用gather auto類似於組合使用gather stale和gather empty。
注意,無論gather stale還是gather auto,都要求進行監視。如果你執行一個alter table xxx monitoring命令,Oracle會用dba_tab_modifications視圖來跟蹤發生變動的表。這樣一來,你就確切地知道,自從上一次 分析統計數據以來,發生了多少次插入、更新和刪除操作。


estimate_percent選項
以下estimate_percent參數是一種比較新的設計,它允許Oracle的dbms_stats在收集統計數據時,自動估計要采樣的一個segment的最佳百分比:
estimate_percent => dbms_stats.auto_sample_size

要驗證自動統計采樣的准確性,你可檢視dba_tables sample_size列。一個有趣的地方是,在使用自動采樣時,Oracle會為一個樣本尺寸選擇5到20的百分比。記住,統計數據質量越好,CBO做出的決定越好。

method_opt選項
dbms_stats的method_opt參數尤其適合在表和索引數據發生變化時刷新統計數據。method_opt參數也適合用於判斷哪些列需要直方圖(histograms)。

某些情況下,索引內的各個值的分布會影響CBO是使用一個索引還是執行一次全表掃描的決策。例如,假如在where子句中指定的值的數量不對稱,全表掃描就顯得比索引訪問更經濟。

如果你有一個高度傾斜的索引(某些值的行數不對稱),就可創建Oracle直方圖統計。但在現實世界中,出現這種情況的機率相當小。使用CBO時,最常見的錯誤之一就是在CBO統計中不必要地引入直方圖。根據經驗,只有在列值要求必須修改執行計划時,才應使用直方圖。

為 了智能地生成直方圖,Oracle為dbms_stats准備了method_opt參數。在method_opt子句中,還有一些重要的新選項,包括 skewonly,repeat和auto:method_opt=>'for all columns size skewonly'
method_opt=>'for all columns size repeat'
method_opt=>'for all columns size auto'

skewonly選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。

假 如dbms_stat發現一個索引的各個列分布得不均勻,就會為那個索引創建直方圖,幫助基於代價的SQL優化器決定是進行索引訪問,還是進行全表掃描訪 問。例如,在一個索引中,假定有一個列在50%的行中,如清單B所示,那么為了檢索這些行,全表掃描的速度會快於索引掃描。-- *************************************************************
-- SKEWONLY option—Detailed analysis
--
-- Use this method for a first-time analysis for skewed indexes
-- This runs a long time because all indexes are examined
--*************************************************************
begin
dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size skewonly',
degree => 7
);
end;


重 新分析統計數據時,使用repeat選項,重新分析任務所消耗的資源就會少一些。使用repeat選項(清單C)時,只會為現有的直方圖重新分析索引,不 再搜索其他直方圖機會。定期重新分析統計數據時,你應該采取這種方式。-- **************************************************************
-- REPEAT OPTION - Only reanalyze histograms for indexes
-- that have histograms
--
-- Following the initial analysis, the weekly analysis
-- job will use the “repeat” option. The repeat option
-- tells dbms_stats that no indexes have changed, and
-- it will only reanalyze histograms for
-- indexes that have histograms.
--**************************************************************begin
dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size repeat',
degree => 7
);
end;

使 用alter table xxx monitoring;命令來實現Oracle表監視時,需要使用dbms_stats中的auto選項。如清單D所示,auto選項根據數據分布以及應 用程序訪問列的方式(例如通過監視而確定的一個列的工作量)來創建直方圖。使用method_opt=>’auto’類似於在dbms_stats 的option參數中使用gather auto。begin
dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size auto',
degree => 7
);
end;

並行收集
Oracle允許以並行方式來收集CBO統計數據,這就顯著提高了收集統計數據的速度。但是,要想並行收集統計數據,你需要一台安裝了多個CPU的SMP服務器。

更快的執行速度
dbms_stats 是提高SQL執行速度的一種出色機制。通過使用dbms_stats來收集最高質量的統計數據,CBO能夠正確判斷執行任何SQL查詢時的最快途徑。 dbms_stats還在不斷地改進。目前,它的一些令人激動的新特性(自動樣本大小和自動直方圖生成)已經顯著簡化了Oracle專家的工作。




在使用DBMS_STATS分析表的時候,我們經常要保存之前的分析,以防分析后導致系統性能低下然后進行快速恢復。
首先創建一個分析表,該表是用來保存之前的分析值。
SQL> begin
2 dbms_stats.create_stat_table(ownname => 'TEST',stattab => 'STAT_TABLE');
3 end;
4 /
PL/SQL 過程已成功完成。
分析表信息
SQL> BEGIN
2 --DBMS_STATS.delete_table_stats(ownname => 'TEST',tabname => 'A');
3 DBMS_STATS.gather_table_stats(ownname => 'TEST',tabname => 'A');
4 END;
5 /
PL/SQL 過程已成功完成。
導出表分析信息到stat_table中。
SQL> BEGIN
2 dbms_stats.export_table_stats(ownname => 'TEST',tabname => 'A',stattab => 'STAT_TABLE');
3 END;
4 /
PL/SQL 過程已成功完成。
SQL>
同理也有
EXPORT_COLUMN_STATS:導出列的分析信息
EXPORT_INDEX_STATS:導出索引分析信息
EXPORT_SYSTEM_STATS:導出系統分析信息
EXPORT_TABLE_STATS:導出表分析信息
EXPORT_SCHEMA_STATS:導出方案分析信息
EXPORT_DATABASE_STATS:導出數據庫分析信息
IMPORT_COLUMN_STATS:導入列分析信息
IMPORT_INDEX_STATS:導入索引分析信息
IMPORT_SYSTEM_STATS:導入系統分析信息
IMPORT_TABLE_STATS:導入表分析信息
IMPORT_SCHEMA_STATS:導入方案分析信息
IMPORT_DATABASE_STATS:導入數據庫分析信息
GATHER_INDEX_STATS:分析索引信息
GATHER_TABLE_STATS:分析表信息,當cascade為 true時,分析表、列(索引)信息
GATHER_SCHEMA_STATS:分析方案信息
GATHER_DATABASE_STATS:分析數據庫信息
GATHER_SYSTEM_STATS:分析系統信息
SQL> select count(*) from stat_table;
COUNT(*)
----------
1
刪除分析信息
SQL> BEGIN
2 DBMS_STATS.delete_table_stats(ownname => 'TEST',tabname => 'A');
3 END;
4 /
PL/SQL 過程已成功完成。
導入分析信息
SQL> BEGIN
2 DBMS_STATS.import_table_stats(ownname => 'TEST',tabname => 'A',stattab => 'STAT_TABLE');
3 END;
4 /
PL/SQL 過程已成功完成。



Oracel dbms_jobs包可以提交作業到作業隊列中,這個包中還提供其它一些函數管理以前提交的作業,如對作業進行修改、禁止或刪除等操作。

常用函數:

submit(),提交作業到作業隊列。

isumbit(),

remove(),從作業隊列中刪除作業。

change(),改變已有作業的參數。

what(),改變作業要執行的代碼。

next_date(),改變作業下一次執行時間。

interval(),改變作業執行的時間間隔。

broken(),暫停執行作業。

run(),強制執行作業。

最常用的submit()函數:

dbms_jobs.submit(

      job out binary_integer,

      what in varchar2,

      next_date in date default sysdate,

      interval in varchar default null,

      no_parse in boolean default false,

      instance in binary_integer default any_instance,

      force in boolean default false

);

submit函數參數:

job,作業的作業號,是個輸出參數,所以調用submit函數時,這個參數要指定一個已存在的變量。

what,作業要執行的代碼,一般是存儲過程。

next_date,下一次作業運行的日期。

interval,作業執行的間隔時間,這個參數默認值是null,也就是what指定的代碼只在next_date這一時間執行一次。

no_parse,默認值是false,當參數值是false,提交作業時就對what指定的代碼進行語法分析;當參數值是true,第一次運行what指定代碼時才進行語法分析。

instance,指明運行作業的數據庫實例。

force,如果是true,instance可以是任何正數;如果是false,instance指定的實例必須正在運行。

示例:

var jobno number;

begin

dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');

--每天18點執行

commit;

end;

上面這段話要在 命令窗口 下運行,如在pl/sql developer里面的-->新鍵-->命令窗口

這樣就會在每天的18點執行存儲過程p_xxx_taxis。

 

 [總結] Oracle表的分析統計

===========================================================
作者: tolywang(http://tolywang.itpub.net)
發表於:2008.09.03 15:19
分類: Oracle數據庫管理 
出處:http://tolywang.itpub.net/post/48/470117
--------------------------------------------------------------- 

討論一: 使用dbms_stats 還是analyze

自從Oracle8.1.5引入dbms_stats包, Oracle及專家們就推薦使用dbms_stats取代analyze 理由如下:

1. dbms_stats可以並行分析

2. dbms_stats有自動分析的功能(alter table monitor )

3. analyze 分析統計信息的有些時候不准確


 

1,2比較好理解,且第2點實際上在VLDB(Very Large Database)中是最吸引人的;3以前比較模糊,看了metalink236935.1 解釋,analyze在分析Partition表的時候,有時候會計算出不准確的Global statistics  原因是dbms_stats會實在的去分析表全局統計信息(當指定參數);而analyze是將表分區(局部)的statistics 匯總計算成表全局statistics ,可能導致誤差。 沒有分區表的情況下兩個都可以使用(看個人習慣,當然也可以分區表使用dbms_stats, 其他使用analyze )

 

不過在一些論壇上也有看到dbms_stats 分析之后出現統計數據不准確的情況,而且確實有bug dbms_stats (可能和版本有關,有待查明),應該是少數情況,需要我們注意。 還有,一般不建議analyze dbms_stats 混用。 實驗: 如果在分區表上用dbms_stats統計后,再使用 analyze table 來統計,就會出現表信息不被更新的問題。 刪除統計信息后再分析就更新了,或者直接用dbms_stats分析。 dbms_stats 目前有遇到的bug例子如下: http://www.itpub.net/viewthread.php?tid=959290&highlight=dbms%5C_stats

 

dbms_stats包可以分析tableIndex或者整個用戶(schema),數據庫,可以並行分析。

不同版本包有些不一樣, dbms_utility (8i以前的工具包)dbms_stats (8i以后提供的工具包,具體的dbms_stats 包的眾多功能介紹見后面。

 

對命令與工具包的一些總結:

1、對於分區表,建議使用DBMS_STATS,而不是使用Analyze語句。

a) 可以並行進行,對多個用戶,多個Table

b) 可以得到整個分區表的數據和單個分區的數據。

c) 可以在不同級別上Compute Statistics:單個分區,子分區,全表,所有分區

d) 可以導出統計信息

e) 可以用戶自動收集統計信息(alter table monitor )

2DBMS_STATS的缺點:

a) 不能Validate Structure (注意:validate structure 主要在於校驗對象的有效性. compute statistics在於統計相關的信息

b) 不能收集CHAINED ROWS(行鏈接), 不能收集CLUSTER TABLE(簇表)的信息,這兩個仍舊需要使用Analyze語句。

c) DBMS_STATS 默認不對索引進行Analyze,因為默認CascadeFalse,需要手工指定為True 。即GATHER_TABLE_STATS:分析表信息,當cascadetrue時,分析表、列(索引)信息

Analyze是同時更新表和索引的統計信息,而dbms_stats會先更新表的統計信息,然后再更新索引的統計信息(默認CascadeFalse),這里就有一個問題,就是當表的統計信息更新后,而索引的統計信息沒有被更新,這時候cbo就有可能選擇錯誤的plan 

3、對於oracle 9里面的External TableAnalyze不能使用,只能使用DBMS_STATS來收集信息。

 

Analyze 命令語法如下 

ANALYZE

{ TABLE [ schema.]table

[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]

| INDEX [ schema. ]index

[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]

| CLUSTER [ schema. ]cluster

}

{ COMPUTE [ SYSTEM ] STATISTICS [for_clause]

| ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]

| validation_clauses

| LIST CHAINED ROWS [ into_clause ]

| DELETE [ SYSTEM ] STATISTICS

} ;

 

dbms_stats所有的功能包如下:

GATHER_INDEX_STATS:分析索引信息

GATHER_TABLE_STATS:分析表信息,當cascadetrue時,分析表、列(索引)信息

GATHER_SCHEMA_STATS:分析方案信息

GATHER_DATABASE_STATS:分析數據庫信息

GATHER_SYSTEM_STATS:分析系統信息

 

EXPORT_COLUMN_STATS:導出列的分析信息

EXPORT_INDEX_STATS:導出索引分析信息

EXPORT_SYSTEM_STATS:導出系統分析信息

EXPORT_TABLE_STATS:導出表分析信息

EXPORT_SCHEMA_STATS:導出方案分析信息

EXPORT_DATABASE_STATS:導出數據庫分析信息

IMPORT_COLUMN_STATS:導入列分析信息

IMPORT_INDEX_STATS:導入索引分析信息

IMPORT_SYSTEM_STATS:導入系統分析信息

IMPORT_TABLE_STATS:導入表分析信息

IMPORT_SCHEMA_STATS:導入方案分析信息

IMPORT_DATABASE_STATS:導入數據庫分析信息

 

 

討論二: analyze 的使用方法 (分區表建議使用dbms_stats)

 

可以參考 http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/statements_46a.htm#SQLRF01105

 

Analyze 的三大功能:

搜集和刪除索引、表和簇的統計信息 驗證表、索引和簇的結構 鑒定表和簇的行遷移(migrated rows)和行鏈接(chained rows)

CBOOracle推薦使用的優化方式,要想使用好CBO,使SQL語句發揮最大效能,必須保證統計數據的及時性。統計信息的生成可以有完全計算法和抽樣估算法。SQL例句如下:

完全計算法: analyze table abc compute statistics; 
抽樣估算法(抽樣20%) analyze table abc estimate statistics sample 20 percent;

對表作完全計算所花的時間相當於做全表掃描,抽樣估算法由於采用抽樣,比完全計算法的生成統計速度要快,如果不是要求要有非常精確的數據的話,盡量采用抽樣分析法。建議對表分析采用抽樣估算,對索引分析可以采用完全計算。

Analyze 分析table, index等需要的權限: 必須在你自己的Schema(方案)中或者有ANALYZE ANY 系統權限 

比如: grant analyze any to tolywang ;

revoke analyze any from tolywang ;

Analyze 使用的局限及改善:

Analyze 命令每次僅僅能影響到一個table(index), 如果想通過analyze為整個schema或整個數據庫中的所有表生成統計數字。可以使用analyze的批處理方式(腳本)

Analyze 分析命令解析:

ANALYZE

{ TABLE [ schema.]table

[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]

| INDEX [ schema. ]index

[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]

| CLUSTER [ schema. ]cluster

}

{ COMPUTE [ SYSTEM ] STATISTICS [for_clause]

| ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]

| validation_clauses

| LIST CHAINED ROWS [ into_clause ]

| DELETE [ SYSTEM ] STATISTICS

} ;

INDEX index 對索引進行分析,分析的結果會放在USER_INDEXES, ALL_INDEXES, DBA_INDEXES 。一般僅需要對索引進行統計時用到。

分析的內容:

Depth of the index from its root block to its leaf blocks (BLEVEL) 從索引的根塊到其葉塊的索引的深度(級數)

Number of leaf blocks (LEAF_BLOCKS) 葉塊的數量,這些塊包括了指向表中及索引中行的指針。

Number of distinct index values (DISTINCT_KEYS) 不同索引值的數量 

Average number of leaf blocks for each index value (AVG_LEAF_BLOCKS_PER_KEY) 包括每一個值的記錄的葉塊的平均數。

Average number of data blocks for each index value (for an index on a table) (AVG_DATA_BLOCKS_PER_KEY) 被一個索引值指向的數據塊的平均數量。

Clustering factor (how well ordered the rows are about the indexed values) (CLUSTERING_FACTOR) 一個簇因子,表明了表中的行的順序和索引中的順序相匹配的緊密程度。

LAST_ANALYZED 為索引生成的統計數字的日期。

TABLE table對表進行分析,分析的結果會放在USER_TABLES, ALL_TABLES DBA_TABLES視圖中,當為表收集統計數字時,除非以別的方式指明,否則Oracle也為那個表中的索引收集統計數字。還有,在分析表的時候,oracle也會分析基於函數的index所引用的表達式。

分析table產生的內容 (在上面的幾個視圖列中可以找到)

Number of rows (NUM_ROWS) * 表中行的數量 

Number of data blocks below the high water mark (that is, the number of data blocks that have been formatted to receive data, regardless whether they currently contain data or are empty) (BLOCKS) 高水位一下的數據塊數量(不管是否現在有數據還是空的

* Number of data blocks allocated to the table that have never been used (EMPTY_BLOCKS) 分配給表但未被數據使用的數據塊的數量。

Average available free space in each data block in bytes (AVG_SPACE) 在每一塊中自由空間數量的平均值(以字節表示)

Number of chained rows (CHAIN_CNT) 鏈接行的數量。

Average row length, including the row's overhead, in bytes (AVG_ROW_LEN) 在表中行的平均長度,以字節表示。

LAST_ANALYZED : 為表生成統計數據的日期。

分析表的限制:

不可以分析數據字典表

不可以分析擴展表,但可以用DBMS_STATS來實現這個目的

不可以分析臨時表

不可以計算或估計下列字段類型:REFs, varrays, nested tables, LOBs (LOBs are not analyzed, they are skipped), LONGs, or object types.

分析分區表最好使用DBMS_STATS來實現 

PARTITION | SUBPARTITION:對分區表或索引進行分析

CLUSTER cluster: 對簇進行分析,分析的結果會放在ALL_CLUSTERS, USER_CLUSTERS and DBA_CLUSTERS.

compute_statistics_clause

語法:COMPUTE [ SYSTEM ] STATISTICS [for_clause]

對分析對像進行精確的統計,然后把信息存儲的數據字典中。可以選擇對表或對字段進行分析。computedestimated這兩種方式的統計數據都被優化器用來影響sql的執行計划

如果指定system選項就只統計系統產生的信息 

for_clause 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM