动态取样是为谓词和表/索引统计收集更加精确的信息从而提高服务器性能,信息越精确产生的性能更好。一般发生在生成执行计划阶段。
可以使用动态取样的情况:
1.) 在收集的统计不能使用或会导致严重的估计错误时估计单表的谓词选择性;
2.) 估计没有统计的表/索引的统计;
3.) 估计统计过期的表和索引的统计;
动态取样特征由参数OPTIMIZER_DYNAMIC_SAMPLING控制,默认级别为2。
动态采样是在解析的时候对表进行采样收集统计信息,但不会写入user_tables
动态采样可以通过hint开启无论OPTIMIZER_DYNAMIC_SAMPLING目前的值是多少
取样级别范围从1..10
1级:满足以下条件则采样所有没被分析的表:
(1)查询中至少有一个未分析表;
(2)这个未分析表被关联另外一个表或者出现在子查询或非merge视图中;
(3)这个未分析表有索引;
(4)这个未分析表有多余动态采样默认的数据块数(默认是32块)。
2级:对所有未分析表进行动态采样。采样数据块数量是默认数量的2倍。
3级:在2级基础上加上那些使用了猜想选择消除表,采样数据块数量等于默认数量。对于未分析表,采样数量2倍于默认数量。
4级:在3级基础上加上那些有单表谓词关联2个或多个列,采样数据块数量等于默认数量。对于未分析表,采样数量2倍于默认数量。
5,6,7,8,9级在4级基础上分别使用2,4,8,32,128倍于默认动态采样数据块数量。
10级:在9级基础上对表中所有数据块进行采样。
新建一个t2表,不对其收集统计信息,查询其中一个数据
SQL> select /*+ dynamic_sampling(t 0)*/ * from t2 where id=30101;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 127 | 3302 | 44 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T2 | 127 | 3302 | 44 (0)| 00:00:01 |
--------------------------------------------------------------------------
SQL> select /*+dynamic_sampling(t 3)*/ * from t2 t where id=30101;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 45 (3)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T2 | 1 | 26 | 45 (3)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=0) –这个值需单独设置
通过在sql使用hint开启动态采样级别能够发现开启后访问的行数明显下降