表分析,简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以进行优化。
语法:
DBMS_STATS.GATHER_TABLE_STATS ( ownnameVARCHAR2, tabnameVARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sampleBOOLEAN, method_opt VARCHAR2, degree NUMBER, granularityVARCHAR2, cascadeBOOLEAN,stattabVARCHAR2, statid VARCHAR2,statownVARCHAR2, no_invalidate BOOLEAN, force BOOLEAN );
列含义:
ownname #要分析表的拥有者
tabname #要分析表的表名
partname #分区的名字,只对分区表或者分区索引有用,默认为:null
estimate_percent#采样行的百分比,取值范围[0.000001,100],null是全部分析不采样,常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.
block_sample #是否用块采样代替行采样,默认为false
method_opt #method_opt:决定histograms信息是怎样被统计的,统计指定列的直方图时建议使用SKEWONLY
method_opt的取值如下:
for all columns:统计所有列的histograms.
for all indexed columns:统计所有indexed列的histograms.
for all hidden columns:统计你看不到列的histograms
for columns SIZE | REPEAT | AUTO | SKEWONLY
SKEWONLY:统计指定列的histograms.N的取值范围[1,254]
REPEAT上次统计过的histograms
AUTO由oracle决定N的大小
degree #决定并行度,默认为null
granularity #设置分区表收集统计信息的粒度 granularity取值:
all:对表达分区,分区,子分区的数据都做分析
auto:Oracle根据分区的类型,自行决定做哪一种粒 度的分析
global:只做全局级别非分析
global and partition:只对全局和分区级别做分析,对子分区不做分析,这是和all的一个区别
partition:只对分区级别做分析
subpartition:只对子分区做分析
cascade #是收集索引的信息.默认为falase
stattab #指定要存储统计信息的表,
statid #对存储在同一个stattab中的表的统计信息做区分
statown #存储统计信息 表的拥有者
no_invalidate #true:当收集完统计信息后,收集对象的cursor不会失效(不会产生新的执行计划,子游标);
false:当收集完统计信息后,收集对象的cursor会立即失效(新的执行计划,新的子游标)
force #即使表锁定了也收集统计信息
统计信息导入导出:
1:创建测试表
SYS@GOOD> create table t as select * from all_objects;Table created.
2.对表进行分析
SYS@GOOD> BEGIN2 dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T');3 END;4 /PL/SQL procedure successfully completed.
3.创建表,存放统计信息
SYS@GOOD> BEGIN2 dbms_stats.create_stat_table(ownname=>'SCOTT',stattab=>'STAT_TABLE');3 END;4 /PL/SQL procedure successfully completed.
4.导出统计信息到stat_table表中
SYS@GOOD> begin2 dbms_stats.export_table_stats(ownname=>'SYS',tabname=>'T',statown=>'SCOTT',stattab=>'STAT_TABLE');3 end;4 /PL/SQL procedure successfully completed.
5.删除统计信息
SYS@GOOD> begin2 dbms_stats.delete_table_stats(ownname=>'SYS',tabname=>'T');3 end;4 /PL/SQL procedure successfully completed.
6.导入统计信息
SYS@GOOD> begin2 dbms_stats.import_table_stats(ownname=>'SYS',tabname=>'T',statown=>'SCOTT',stattab=>'STAT_TABLE');3 end;4 /PL/SQL procedure successfully completed.
7.验证
SYS@GOOD> SELECT num_rows,blocks,empty_blocks as empty, avg_space, chain_cnt, avg_row_len FROM dba_tables WHERE owner = 'SYS'2 AND table_name = 'T';NUM_ROWSBLOCKSEMPTY AVG_SPACE CHAIN_CNT AVG_ROW_LEN---------- ---------- ---------- ---------- ---------- -----------85265 121600098
如果觉得《【Oracle】DBMS_STATS.GATHER_TABLE_STATS分析表》对你有帮助,请点赞、收藏,并留下你的观点哦!