Oracle-探究统计信息收集自动采样AUTO_SAMPLE_SIZE

前言:

        Oracle数据库进行统计信息收集时,可以通过ESTIMATE_PERCENT参数指定采样方式或者比例,有以下4种指定的方式

1 统计信息收集时不指定值,这时候ESTIMATE_PERCENT值为默认值DBMS_STATS.AUTO_SAMPLE_SIZE,自动采样

2 指定采样比例,范围可以为0.000001到100

3 指定采样方式为自动采样DBMS_STATS.AUTO_SAMPLE_SIZE

4 指定为null,这时候采样比例为100

 

统计收集测试:

        对一张1000W行的1.2G的表TEST进行统计信息收集测试,分别使用指定采样比例方式以及自动采样方式进行收集测试

        使用estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE自动采样方式,花费时间9.04秒

SQL> exec  DBMS_STATS.GATHER_TABLE_STATS(ownname=>'TEST', tabname=>'TEST',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt       =>'for all columns size auto',no_invalidate    => FALSE,degree=> 8,  cascade=> TRUE);
​
PL/SQL procedure successfully completed.
​
Elapsed: 00:00:09.04

        查看表统计信息收集的采样比例,这里自动采样使用的比例为100

4f1060997b95972ddab2764962759159.png

        查看表列统计信息的采样比例为,可以看到对于收集直方图信息的owner,created列,采样比例发生了改变,这里使用了一个很低的采样比例大小

 

ab16851fb6a4fab735a885b2db41c244.png

        查看索引统计信息的采样比例,这里同样也是使用了一个很低的采样比例

edbf56a93d4a1a26428a0776001f52f7.png

        使用estimate_percent =>30指定30%比例采样,花费时间28秒,慢了2倍左右

SQL> exec  DBMS_STATS.GATHER_TABLE_STATS(ownname=>'TEST', tabname=>'TEST',estimate_percent => 30, method_opt       =>'for all columns size auto',no_invalidate    => FALSE,degree=> 8,  cascade=> TRUE);
​
PL/SQL procedure successfully completed.
​
Elapsed: 00:00:28.27
SQL> 

查看表统计信息收集的采样比例,跟指定的比例一样为30%

6d880a285831f70b557a538686c7e63a.png

查看列统计信息收集的采样比例,跟指定的比例一样为30%

6f5120306b1d0f6d3162248319a5cbe3.png

查看索引统计信息收集的采样比例,跟指定的比例一样为30%

f55877ce3b7d466f3c9b8bfa2b79786c.png

分析DBMS_STATS.AUTO_SAMPLE_SIZE自动采样的执行过程:

        通过10046j进行跟踪,分析DBMS_STATS.AUTO_SAMPLE_SIZE自动采集的过程

主要执行的语句步骤如下

        1 获取表的统计信以及列的统计信息,这里采用的是100比例的采样,也是主要的耗时操作

bed8e54ec4f524e1182b83f7c54763d6.png

        2 对于要收集直方图信息的列,按0.0495277038比例的采样数据插入临时表ora_temp_1_ds_110008

f3195753cc7df433707d1cc5610e5121.png

        3 从临时表ora_temp_1_ds_110008分组统计owner列频率直方图列的信息

813519a1081e51f5098a6f952a59d488.png

        4 从临时表ora_temp_1_ds_110008分组统计created列的高度均衡直方图的信息

cf07ca7da01218a55cecdaa76036a3e9.png

        5 清空临时表数据

        truncate table sys.ora_temp_1_ds_110008

        6 按4.3728587743的采样比例收集索引IND_TEST_OWNER的统计信息

8d50774daa472a49d85101e3323c5ea0.png

        7 按3.8608254352的采样比例收集索引IND_TEST_CREATED的统计信息

57e0673a82a071f5e981f3c727938b62.png

        可以看到DBMS_STATS.AUTO_SAMPLE_SIZE默认对于全表的采用的是100%的采样比例收集,但对于索引,需要收集直方图信息的列单独采集的比例很低,所以整体的速度提升很多

        从Oracle mos的文档How to Gather Optimizer Statistics on 11g (Doc ID 749227.1)我们也可以看到在Oracle11g版本,为了对表本身收集尽可能的准确以及11g版本后使用了新的更快的hash算法去计算统计信息,所以默认对于表自身的统计信息收集采用的比例是100%,而对于列级别的统计信息采集比例则采用内部自动计算的方式

82b06eaba634eac97d8f8bffe6a1ef56.png

分析指定采样比例的执行过程:

        继续通过10046跟踪分析指定采样比例30%的收集过程

        主要执行的语句步骤如下

        1 按30%采样全表扫描,获取表的统计信以及列的统计信息

841ff3d0b779db01eebd94c5567b80e3.png

        2 按30%采样分组统计owner列频率直方图列的信息

 

f8fcd6969c4cf3e542c6509211d4cb1b.png

 

dbdbf8518365fe8e3c6d31c30e05ea61.png

        3 按30%采样分组统计created列高频直方图列的信息

 

6d131d0564db906f220ceb8af4c6faa6.png

        4 按采样30%的比例收集索引IND_TEST_OWNER的统计信息

a62324d2feefd627d4033ae3414c13db.png

        5 按采样30的比例收集索引IND_TEST_CREATED的统计信息

b2b703ea301f96f438d2ec7d586a59bb.png

        可以看到指定采样比例的方式,全程不管是对于表,列的直方图以及索引都采集30%表数据的方式进行采样,所以在列的直方图以及索引这一块的消耗时间要比DBMS_STATS.AUTO_SAMPLE_SIZE高,整个过程下来收集的时间相对较长,要多次执行对表统计信息收集表TEST的全表扫描

 

总结:

        测试下来,在Oracle11g 版本使用DBMS_STATS.AUTO_SAMPLE_SIZE的方式进行统计信息收集还是比较不错的方式,在确保表自身统计信息准确的情况下,对于一些额外的统计信息列直方图,索引,则采取使用内部自动计算采样比例进行收集,兼具了采集的准确度高以及较高的执行效率

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值