日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DBMS_STATS.GATHER_TABLE_STATS详解

發(fā)布時間:2025/7/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DBMS_STATS.GATHER_TABLE_STATS详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于Oracle的優(yōu)化器是CBO,所以對象的統(tǒng)計數(shù)據(jù)對執(zhí)行計劃的生成至關重要!

作用:DBMS_STATS.GATHER_TABLE_STATS統(tǒng)計表,列,索引的統(tǒng)計信息(默認參數(shù)下是對表進行直方圖信息收集,包含該表的自身-表的行數(shù)、數(shù)據(jù)塊數(shù)、行長等信息;列的分析--列值的重復數(shù)、列上的空值、數(shù)據(jù)在列上的分布情況;索引的分析-索引頁塊的數(shù)量、索引的深度、索引聚合因子).

?

DBMS_STATS.GATHER_TABLE_STATS的語法如下:

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

參數(shù)說明:

ownname:要分析表的擁有者

tabname:要分析的表名.

partname:分區(qū)的名字,只對分區(qū)表或分區(qū)索引有用.

estimate_percent:采樣行的百分比,取值范圍[0.000001,100],null為全部分析,不采樣. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默認值,由oracle決定最佳取采樣值.

block_sapmple:是否用塊采樣代替行采樣.

method_opt:決定histograms信息是怎樣被統(tǒng)計的.method_opt的取值如下(默認值為FOR ALL COLUMNS SIZE AUTO):

for all columns:統(tǒng)計所有列的histograms.

for all indexed columns:統(tǒng)計所有indexed列的histograms.

for all hidden columns:統(tǒng)計你看不到列的histograms

for columns?SIZE?| REPEAT | AUTO | SKEWONLY:統(tǒng)計指定列的histograms.N的取值范圍[1,254]; REPEAT上次統(tǒng)計過的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,如果是true,表示不僅對全局數(shù)據(jù)、分區(qū)數(shù)據(jù)進行數(shù)據(jù)分析,而且還對索引的所有信息進行數(shù)據(jù)分析,包括索引的全局數(shù)據(jù)、分區(qū)數(shù)據(jù).

stattab:指定要存儲統(tǒng)計信息的表,statid如果多個表的統(tǒng)計信息存儲在同一個stattab中用于進行區(qū)分.statown存儲統(tǒng)計信息表的擁有者.以上三個參數(shù)若不指定,統(tǒng)計信息會直接更新到數(shù)據(jù)字典.

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

force:即使表鎖住了也收集統(tǒng)計信息.

例子:

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 分析統(tǒng)計信息的不準確some times
1,2好理解,且第2點實際上在VLDB中是最吸引人的;3以前比較模糊,看了metalink236935.1 解釋,analyze在分析Partition表的時候,有時候會計算出不準確的Global statistics .
原因是,dbms_stats會實在的去分析表全局統(tǒng)計信息(當指定參數(shù));而analyze是將表分區(qū)(局部)的statistics 匯總計算成表全局statistics ,可能導致誤差。
如果想分析整個用戶或數(shù)據(jù)庫,還可以采用工具包,可以并行分析
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分析統(tǒng)計信息?
--創(chuàng)建統(tǒng)計信息歷史保留表?

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


--導出整個scheme的統(tǒng)計信息?

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') ;


--如果發(fā)現(xiàn)執(zhí)行計劃走錯,刪除表的統(tǒng)計信息

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


--導入表的歷史統(tǒng)計信息

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


--如果進行分析后,大部分表的執(zhí)行計劃都走錯,需要導回整個scheme的統(tǒng)計信息

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


--導入索引的統(tǒng)計信息

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


分析數(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?

可以查看表 DBA_TABLES來查看表是否與被分析過,如:

SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES

?

?

這是對命令與工具包的一些總結
1、對于分區(qū)表,建議使用DBMS_STATS,而不是使用Analyze語句。
a) 可以并行進行,對多個用戶,多個Table
b) 可以得到整個分區(qū)表的數(shù)據(jù)和單個分區(qū)的數(shù)據(jù)。
c) 可以在不同級別上Compute Statistics:單個分區(qū),子分區(qū),全表,所有分區(qū)
d) 可以倒出統(tǒng)計信息
e) 可以用戶自動收集統(tǒng)計信息
2、DBMS_STATS的缺點
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,這兩個仍舊需要使用Analyze語句。
c) DBMS_STATS 默認不對索引進行Analyze,因為默認Cascade是False,需要手工指定為True
3、對于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS來收集信息。

總結

以上是生活随笔為你收集整理的DBMS_STATS.GATHER_TABLE_STATS详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。