收集统计信息(二) 之 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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值