收集统计信息(二) 之 dbms_stats

这次讲解一下收集统计信息常用的存储过程

收集统计信息类:

一、dbms_stats.gather_table_stats存储过程
This procedure gathers table and column (and index) statistics. It attempts to parallelize as much of the work as possible, but there are some restrictions as described in the individual parameters.
SQL> desc dbms_stats.gather_table_stats;
Parameter        Type     Mode Default?
---------------- -------- ---- --------
OWNNAME          VARCHAR2 IN            --所有者的姓名
TABNAME          VARCHAR2 IN            --要分析的表名
PARTNAME         VARCHAR2 IN   Y        --要分析的分区名称
ESTIMATE_PERCENT NUMBER   IN   Y        --采样的比例
BLOCK_SAMPLE     BOOLEAN  IN   Y        --是否块分析
METHOD_OPT       VARCHAR2 IN   Y        --分析的方式
DEGREE           NUMBER   IN   Y        --分析的并行度
GRANULARITY      VARCHAR2 IN   Y        --分析的粒度
CASCADE          BOOLEAN  IN   Y        --是否分析索引
STATTAB          VARCHAR2 IN   Y        --使用的性能表名
STATID           VARCHAR2 IN   Y        --性能表的标识
STATOWN          VARCHAR2 IN   Y        --性能表的所有者
NO_INVALIDATE    BOOLEAN  IN   Y        --是否有验证游标的关系
STATTYPE         VARCHAR2 IN   Y        
FORCE            BOOLEAN  IN   Y        --强制分析,即使表被锁定

除了owner、tabname之外,其他的参数都有默认的值,比如,我们分析t表,同时分析索引我们就可以执行以下语句:
SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);
 
PL/SQL procedure successfully completed

如果想要知道某个参数当前的默认值,可以使用dbms_stats.get_param来获得。

SQL> select dbms_stats.get_param('METHOD_OPT') from dual;
 
DBMS_STATS.GET_PARAM('METHOD_O')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE AUTO

下面我们来一个个介绍比较重要的参数
1、采样的比例(ESTIMATE_PERCENT)
查看默认值:
SQL> select dbms_stats.get_param('ESTIMATE_PERCENT') from dual;
 
dbms_stats.get_param('ESTIMATE_PERCENT')
--------------------------------------------------------------------------------
DBMS_STATS.AUTO_SAMPLE_SIZE
这个值为多少没有定论,理论上讲越多越好。如果你的数据直方图比较均匀,就可以用默认参数DBMS_STATS.AUTO_SAMPLE_SIZE,让oracle自己来判断。有时候,特别是批量加载的表
我们可以预估计表中的数量,可以人工设置一个合理的值(多少呢?),比如在我使用的生产数据库中,就是手动设置这个值,对于一个有1000w数据库的分区表,就把这个参数设置为0.000001,这是一个经验值。

2、分析样式(METHOD_OPT)
这个参数用来定义直方图分析的一些值,包括以下的一些选项
1)所有列:FOR ALL COLUMNS
2)索引列:只对索引的列进行分析,FOR ALL INDEXED COLUNMS
3)隐藏列:只对隐藏的列进行分析,FOR ALL HIDDEN COLUMNS
4)显示指定列:显示的指定那些列进行分析,FOR COLUMNS cloumns_name
这个参数的默认值是FOR ALL COLUMNS SIZE AUTO。
一般来说,对索引进行分析是比较合适的,通常,如果谓词中引用到某个列,大多数时候这个列上是应该创建索引的,这样可以使sql的性能得到提高;因为要使用索引上的数据,所以要对有索引的列上做直方图,这样CBO才能最大的了解索引键值中的数据分布情况,比如说是否有数据倾斜等。

3、并行度(Degree)
查看默认值:
SQL>  select dbms_stats.get_param('Degree') from dual;
 
DBMS_STATS.GET_PARAM('DEGREE')
--------------------------------------------------------------------------------
NULL
1)NULL create和alter 表的时候会指定并行度,如果Degree设置为改值的时候,oracle讲使用被分析表的属性的并行度。
2)一个数值 可以显示地指定分析时使用的并行度
3)Default_Degree
  如果设置这个值,oracle将根据初始化参数中的相关设置来决定使用的并行度。
 
4、分析的粒度(GRANULARITY)  
查看默认值:
SQL>  select dbms_stats.get_param('GRANULARITY') from dual;
 
dbms_stats.get_param('GRANULARITY')
--------------------------------------------------------------------------------
AUTO
1)ALL:将会对表的全局(Global)、分区、子分区的数据都做分析。
2)AUTO:Oracle根据分区的类型,自动决定做哪一种粒度的分析。
3)Global:只做全局的分析
4)Global AND PARTITION:只对全局和分区级别做分析,对子分区不做分析,这个和ALL的一个级别
5)PARTITION:只在分区级别做分析
6)SBUPARTITION:只在子分区做分析
这个参数比较有意思,在oltp和olap中要区别对待,一般在olap或者数据库仓库的环境里,这个参数设置的选择会直接影响到CBO的执行计划。
在OLAP或者数据仓库系统中,经常有这样的事情,新创建一个分区,将批量的数据(通常是很大的数据)加载到分区中,对分区做分析,然后做报表或者数据挖掘。 在理想的情况下,对表的全局,分区都做分析,这样才能得到最充足的数据,但是通常这样的表都非常大,如果每增加一个分区都需要做一次全局分析,那么会消耗极大的系统资源。 但是如果只对新加入的分区进行分区而不做全局分析,oracle 在全局范围内的信息就会不准确。
该参数在默认情况下,DBMS_STATS 包会对表级(全局),分区级(对应参数partition)都会进行分析。 如果把cascade 设置为true,相应索引的全局和分区级别也都会被分析。 如果只对分区级进行分析,而全局没有分析,那么全局信息没有更新,依然会导致CBO 作出错误的执行计划。

所以当一些新的数据插入到表中时,如果对这些新的数据进行分析,是一个非常重要的问题。 一般参考如下原则:
(1)看一下新插入的数据在全表中所占的比例,如果所占比例不是很大,那么可以考虑不做全局分析,否则就需要考虑,一句是业务的实际运行情况。
(2)采样比例。如果载入的数据量非常大,比如上千万或者更大,就要把采样比例压缩的尽可能地小,但底线是不能影响CBO做出正确的执行计划,采样比例的上线是不能消耗太多的资源而影响到业务的正常运行。
(3)新加载的数据应该要做分区级的数据分析。 至于是否需要直方图分析,以及设置多少个buckets(size参数指定),需要DBA一句数据的分布情况进行考虑,关键是视数据的倾斜程度而定。


二、dbms_stats.GATHER_SCHEMA_STATS存储过程
This procedure gathers statistics for all objects in a schema.
DBMS_STATS.GATHER_SCHEMA_STATS (
ownname          VARCHAR2,
estimate_percent NUMBER   DEFAULT to_estimate_percent_type
                                                (get_param('ESTIMATE_PERCENT')),
block_sample     BOOLEAN  DEFAULT FALSE,
method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),
degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),
granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),
stattab          VARCHAR2 DEFAULT NULL,
statid           VARCHAR2 DEFAULT NULL,
options          VARCHAR2 DEFAULT 'GATHER',
objlist          OUT      ObjectTab,
statown          VARCHAR2 DEFAULT NULL,
no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type (
                                     get_param('NO_INVALIDATE')),
force             BOOLEAN DEFAULT FALSE,
obj_filter_list  ObjectTab DEFAULT NULL);

这个存储过程用于对某个用户下所有的对象进行分析。
优点:用户对象非常多分析方便
缺点:所有的分析使用相同的分析策略

这个存储过程大多数参数和gather_table_stats是一样的,大家可以参照前面的论述
值得一提的是有个 OPTIONS 参数
1)GATHER 对用户下的所有对象分析
2)GATHER AUTO:由Oracle决定哪些对象需要分析和如何分析,当这个参数被设置后,除了ownname、stattab、statid、objlist、statown,其余参数全部全部忽略。
3)GATHER STALE:Oracle只对陈旧的数据进行分析,Oracle通过*_tab_modifications视图来找到哪些对象的信息已经陈旧,从而对他们进行分析。
4)GATHER EMPTY:只对没有统计分析数据的对象进行分析。
5)LIST AUTO:返回一个由GATHER AUTO产生的被分析对象的列表。
6)LIST STALE:返回一个Oracle收集的统计信息过时的对象列表。
7)LIST EMPTY返回一个没有统计分析数据的对象列表。

三、GATHER_INDEX_STATS Procedure
This procedure gathers index statistics. It attempts to parallelize as much of the work as possible. Restrictions are described in the individual parameters. This operation will not parallelize with certain types of indexes, including cluster indexes, domain indexes, and bitmap join indexes. The granularity and no_invalidate arguments are not relevant to these types of indexes.
如果分析表的时候,cascade选择true时候,索引被自动分析,cluster indexes, domain indexes, and bitmap join indexes等不能使用并行分析。
DBMS_STATS.GATHER_INDEX_STATS (
   ownname          VARCHAR2,
   indname          VARCHAR2,
   partname         VARCHAR2 DEFAULT NULL,
   estimate_percent NUMBER   DEFAULT to_estimate_percent_type
                                                (GET_PARAM('ESTIMATE_PERCENT')),
   stattab          VARCHAR2 DEFAULT NULL,
   statid           VARCHAR2 DEFAULT NULL,
   statown          VARCHAR2 DEFAULT NULL,
   degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),
   granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
   no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type
                                               (GET_PARAM('NO_INVALIDATE')),
   force            BOOLEAN DEFAULT FALSE);

获取信息类:
GET_COLUMN_STATS Procedures
GET_INDEX_STATS Procedures
GET_SYSTEM_STATS Procedure
GET_TABLE_STATS Procedure

设置信息类:
SET_COLUMN_STATS Procedures
SET_INDEX_STATS Procedures
SET_SYSTEM_STATS Procedure
SET_TABLE_STATS Procedure

删除统计信息
。。其他参考官方文档就不一一描述了。

  

你可能感兴趣的:(oracle,sql,table,null,存储,statistics)