【Oracle】DBMS_STATS.GATHER_TABLE_STATS詳解

因爲Oracle的優化器是CBO,因此對象的統計數據對執行計劃的生成相當重要!
 
 做用:DBMS_STATS.GATHER_TABLE_STATS統計表,列,索引的統計信息(默認參數下是對錶進行直方圖信息收集,包含該表的自身-表的行數、數據塊數、行長等信息;列的分析--列值的重複數、列上的空值、數據在列上的分佈狀況;索引的分析-索引頁塊的數量、索引的深度、索引聚合因子).

 

DBMS_STATS.GATHER_TABLE_STATS的語法以下:sql

DBMS_STATS.GATHER_TABLE_STATS (   ownname          VARCHAR2,     tabname          VARCHAR2,     partname         VARCHAR2,   estimate_percent NUMBER,     block_sample     BOOLEAN,   method_opt       VARCHAR2,   degree           NUMBER,   granularity      VARCHAR2,     cascade          BOOLEAN,   stattab          VARCHAR2,     statid           VARCHAR2,   statown          VARCHAR2,   no_invalidate    BOOLEAN,   force            BOOLEAN);數據庫

參數說明:oracle

ownname:要分析表的擁有者app

tabname:要分析的表名.工具

partname:分區的名字,只對分區表或分區索引有用.優化

estimate_percent:採樣行的百分比,取值範圍[0.000001,100],null爲所有分析,不採樣. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默認值,由oracle決定最佳取採樣值.對象

block_sapmple:是否用塊採樣代替行採樣.索引

method_opt:決定histograms信息是怎樣被統計的.method_opt的取值以下(默認值爲FOR ALL COLUMNS SIZE AUTO):ip

for all columns:統計全部列的histograms.get

for all indexed columns:統計全部indexed列的histograms.

for all hidden columns:統計你看不到列的histograms

for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:統計指定列的histograms.N的取值範圍[1,254]; REPEAT上次統計過的histograms;AUTO由oracle決定N的大小;SKEWONLY multiple end-points with the same value which is what we define by "there is skew in thedata

degree:決定並行度.默認值爲null.

granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned.

cascade:是收集索引的信息.默認爲FALSE.

stattab:指定要存儲統計信息的表,statid若是多個表的統計信息存儲在同一個stattab中用於進行區分.statown存儲統計信息表的擁有者.以上三個參數若不指定,統計信息會直接更新到數據字典.

no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.

force:即便表鎖住了也收集統計信息.

例子:

execute dbms_stats.gather_table_stats(ownname => 'owner',tabname => 'table_name' ,estimate_percent => null ,method_opt => 'for all indexed columns' ,cascade => true);

------------------------------------------------------------------------------------------------------------------------

自從Oracle8.1.5引入dbms_stats包,Experts們便推薦使用dbms_stats取代analyze。 理由以下
dbms_stats能夠並行分析
dbms_stats有自動分析的功能(alter table monitor )
analyze 分析統計信息的不許確some times
1,2好理解,且第2點實際上在VLDB中是最吸引人的;3之前比較模糊,看了metalink236935.1 解釋,analyze在分析Partition表的時候,有時候會計算出不許確的Global statistics .
緣由是,dbms_stats會實在的去分析表全局統計信息(當指定參數);而analyze是將表分區(局部)的statistics 彙總計算成表全局statistics ,可能致使偏差。
若是想分析整個用戶或數據庫,還能夠採用工具包,能夠並行分析
Dbms_utility(8i之前的工具包)
Dbms_stats(8i之後提供的工具包)

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

如何使用dbms_stats分析統計信息?
--建立統計信息歷史保留表 

sql> exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table') ; 


--導出整個scheme的統計信息 

sql> exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table') ; 


--分析scheme

Exec dbms_stats.gather_schema_stats( 
ownname => 'scott', 
options => 'GATHER AUTO', 
estimate_percent => dbms_stats.auto_sample_size, 
method_opt => 'for all indexed columns ', 
degree => 6 ) 


--分析表

sql> exec dbms_stats.gather_table_stats(ownname => 'scott',tabname => 'work_list',estimate_percent => 10,method_opt=> 'for all indexed columns') ; 


--分析索引

SQL> exec dbms_stats.gather_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',estimate_percent => '10',degree => '4') ;


--若是發現執行計劃走錯,刪除表的統計信息

SQL>dbms_stats.delete_table_stats(ownname => 'scott',tabname => 'work_list') ;


--導入錶的歷史統計信息

sql> exec dbms_stats.import_table_stats(ownname => 'scott',tabname => 'work_list',stattab => 'stat_table') ; 


--若是進行分析後,大部分表的執行計劃都走錯,須要導回整個scheme的統計信息

sql> exec dbms_stats.import_schema_stats(ownname => 'scott',stattab => 'stat_table');


--導入索引的統計信息

SQL> exec dbms_stats.import_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',stattab => 'stat_table') 


--檢查是否導入成功

SQL> select table_name,num_rows,a.blocks,a.last_analyzed from all_tables a where a.table_name='WORK_LIST'; 


分析數據庫(包括全部的用戶對象和系統對象):gather_database_stats 
分析用戶全部的對象(包括表、索引、簇):gather_schema_stats
分析表:gather_table_stats
分析索引:gather_index_stats 
刪除數據庫統計信息:delete_database_stats
刪除用戶方案統計信息:delete_schema_stats
刪除表統計信息:delete_table_stats 
刪除索引統計信息:delete_index_stats
刪除列統計信息:delete_column_stats 
設置表統計信息:set_table_stats
設置索引統計信息:set_index_stats
設置列統計信息:set_column_stats 

能夠查看錶 DBA_TABLES來查看錶是否與被分析過,如:

SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES

 

 

這是對命令與工具包的一些總結一、對於分區表,建議使用DBMS_STATS,而不是使用Analyze語句。a) 能夠並行進行,對多個用戶,多個Tableb) 能夠獲得整個分區表的數據和單個分區的數據。c) 能夠在不一樣級別上Compute Statistics:單個分區,子分區,全表,全部分區d) 能夠倒出統計信息e) 能夠用戶自動收集統計信息二、DBMS_STATS的缺點a) 不能Validate Structureb) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,這兩個仍舊須要使用Analyze語句。c) DBMS_STATS 默認不對索引進行Analyze,由於默認Cascade是False,須要手工指定爲True三、對於oracle 9裏面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集信息。

相關文章
相關標籤/搜索