可以使用Oracle内置的程序包DBMS_STATS来查看或修改搜集的数据库统计信息,本篇主要介绍GATHER_TABLE_STATS过程,通过该过程,可以搜集表和列(或索引)的统计信息。
1 语法
dbms_stats.gather_table_stats(ownname varchar2,
tabname varchar2,
partname varchar2 default null,
estimate_percent number default default_estimate_percent,
block_sample boolean default false,
method_opt varchar2 default default_method_opt,
degree number default default_degree_value,
granularity varchar2 default default_granularity,
cascade boolean default default_cascade,
stattab varchar2 default null,
statid varchar2 default null,
statown varchar2 default null,
no_invalidate boolean default to_no_invalidate_type(get_param('NO_INVALIDATE')),
stattype varchar2 default 'DATA',
force boolean default false,
-- the context is intended for internal use only.
context dbms_stats.ccontext default null,
options varchar2 default default_options);
标红的是比较常用的参数。
2 参数说明
重点介绍下面几个参数。
2.1 method_opt
method_opt对应的值有如下两者或者两者的结合,默认值是FOR ALL COLUMNS SIZE AUTO:
- FOR ALL [ INDEXED | HIDDEN ] COLUMNS [size_clause]
- FOR COLUMNS [column_clause] [size_clause]
size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}
column_clause := column_name | extension name | extension
其中,
- integer:表示直方图桶的数目,必须在1-2048范围内;
- REPEAT:仅在已经具有直方图的列上收集直方图;
- AUTO:Oracle根据数据分布和列的工作负责确定要收集直方图的列;
- SKEWONLY:Oracle根据列的数据分布确定要收集直方图的列;
- column_name:列名;
- extension:可以是列组,格式为(column_name,column_name ....),也可以是表达式;
2.2 degree
该参数设置并行度,默认是NULL,意味着使用建表时默认设置的并行度,通过设置并行度,可以提高执行的效率。
2.3 granularity
该参数设置要收集的统计信息的粒度(只在分区表时使用)。值包含:
- ALL:收集所有(子分区、分区、全局)的统计信息;
- APPROX_GLOBAL AND PARTITION:和GLOBAL AND PARTITION相似,但是在这种情况下,全局统计信息是从分区级统计信息聚合而来的,此选项将聚合除列的不同值数和索引的不同键值之外的所有统计信息;
- AUTO:默认值,基于分区的类型决定分区的粒度;
- DEFAULT:收集全局和分区级别的统计信息,该选项已过期;
- GLOBAL:收集全局统计信息;
- GLOBAL AND PARTITION:收集全局和分区级别的统计信息,不收集子分区统计信息;
- PARTITION:收集分区级别的统计信息;
- SUBPARTITION:收集子分区级别的统计信息。
对于分区表,建议设置该参数值为ALL。
2.4 cascade
该参数在收集表的统计信息的同时,也会收集索引统计信息,使用此选项等效于运行GATHER_INDEX_STATS过程。
2.5 no_invalidate
该参数值若设为TRUE,则与该表相关联的游标不会失效,设置为FALSE,则会使对应的游标立即失效,在大批量数据操作,重新收集统计信息时,建议将该参数设置为FALSE,避免因为收集了统计信息,从而使原来的SQL选择错误的执行计划。
2.6 options
该参数值进一步说明哪些对象收集统计信息,参数值包含:
- GATHER:在所有对象上收集统计信息;
- GATHER AUTO:自动收集所有必要的统计信息,由Oracle隐式确定哪些对象需要新的统计信息。