,,,动态采样(动态采样)是在ORACLE 9 i释放2中开始引入的一个技术,引入它的目的是为了应对数据库对象没有分析(统计信息缺失)的情况下,优化器生成更好的执行计划。简单的说,在数据库段(表,索引,分区)对象没有分析的情况下,为了使CBO优化器得到足够多的信息以保证优化器做出正确执行计划而发明的一种技术。它会分析一定数量段对象上的数据块获取CBO需要的统计信息。动态采样技术仅仅是统计信息的一种补充,它不能完全替代统计信息分析。
注意:动态采样在ORACLE 11 g之前称为动态采样,甲骨文12 c之后改名为动态统计。
Oracle11G R2默认的采样级别:
完成显示参数optimizer_dynamic_sampling
名称,,,,,,,,,,,,,,,,类型,,,,价值
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
optimizer_dynamic_sampling,,,,,整数,,2
完成显示参数动态统计
名称,,,,,,,,,,,,,,,,类型,,,,价值
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
optimizer_dynamic_sampling,,,,,整数,,2
动态采样的级别有11个级别:请自行查看官方文档
http://docs.oracle.com/cd/E11882_01/server.112/e41573/stats.htm PFGRF30101
动态采样实验:
1,创建测试表测试
完成;select * from dba_objects创建表测试;,,,,,
创建表。
完成选择计数(1)从测试;
,数(1)
- - - - - - - - - - -
,,86259年,
2,不使用动态采样,查看执行计划
完成autotrace traceon解释;
完成选择/* + dynamic_sampling(0)测试*/*从测试;,,
执行计划- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
计划散列值:1357081020
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Id, |操作,,,,| |行名称,时间成本(% CPU) | | |字节,,|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|,| 0 | SELECT语句还以为;,|大敌;100 k |,19米|大敌;336年,(1)| 00:00:05 |
|,1 |,表访问完整的测试| |,100 k |,19米|大敌;336年,(1)| 00:00:05 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
,,这句话所用的动态取样(级别=2)
从上面可以看出,次数优化器估计表测试的行数显示为100 k,我们再看下面使用动态采样的执行计划,优化器会估算多少行:
3,使用动态采样,查看执行计划(下面是直接查询的,因为在11 g是默认启用动态采样的)
完成从测试;select *
执行计划
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
计划散列值:1357081020
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Id, |操作,,,,| |行名称,时间成本(% CPU) | | |字节,,|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|,| 0 | SELECT语句还以为;,| 72258 |大敌;14 m |大敌;336年,(1)| 00:00:05 |
|,1 |,表访问完整的测试| 72258 | |,14 m |大敌;336年,(1)| 00:00:05 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
,,这句话所用的动态取样(级别=2)
,,
,,
如果启用动态采样(默认情况下,动态采样级别为2),优化器根据动态采样得到一些数据信息猜测,估计表测试的记录行数为86259,已经接近实际记录行数72258了。比不做动态采样分析要好很多了。
如果我们将动态采样的级别提高为3,如下所示,发现优化器根据动态采样得到的信息比默认(默认情况下,动态采样级别为2)情况获得的信息更准确。优化器估计表测试的行数为92364人,比72258年又接近实际情况一步了。