2、动态采样的级别

Oracle 为动态采样划分了11个级别,在Oracle 的官网上详细的介绍。

13.5.7.4 Dynamic Sampling Levels

http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/stats.htm#PFGRF94760

 

(1)Level 0

不做动态分析

 

(2)Level 1

Oracle 对没有分析的表进行动态采样,但需要同时满足以下4个条件。

(a)SQL中至少有一个未分析的表

(b)未分析的表出现在关联查询或者子查询中

(c)未分析的表没有索引

(d)未分析的表占用的数据块要大于动态采样默认的数据块(32个)


(3) Level 2

对所有的未分析表做分析,动态采样的数据块是默认数据块的2倍。


(4)Level 3

采样的表包含满足Level 2定义的所有表,同时包括,那些谓词有可能潜在地需要动态采样的表,这些动态采样的数据块为默认数据块,对没有分析的表,动态采样的默认块为默认数据块的2倍。


(5)Level 4

采样的表包含满足Level 3定义的表,同时还包括一些表,他们包含一个单表的谓词会引用另外的2个列或者更多的列;采样的块数是动态采样默认数据块数;对没有分析的表,动态采样的数据块为默认数据块的2倍。


(6) Level 5,6,7,8,9

采样的表包含满足Level 4定义的表,同时分别使用动态采样默认数据块的2,4,8,32,128 倍的数量来做动态分析。


(7)Level 10

采样的表包含满足Level 9定义的所有表,同时对表的所有数据进行动态采样。


采样的数据块越多,得到的分析数据就越接近与真实,但同时伴随着资源消耗的也越大。


3、什么时候使用动态采样

动态采样也需要额外的消耗数据库资源,所以,如果 SQL 被反复执行,变量被绑定,硬分析很少,在这样一个环境中,是不宜使用动态采样的,就像OLTP系统。 动态采样发生在硬分析时,如果很少有硬分析发生,动态采样的意义就不大。


而在OLAP或者数据仓库环境下,SQL执行消耗的资源要远远大于SQL解析,那么让解析在消耗多一点资源做一些动态采样分析,从而做出一个最优的执行计划是非常值得的。 实际上在这样的环境中,硬分析消耗的资源几乎是可以忽略的。


所以,一般在OLAP 或者数据仓库环境中,将动态采样的level 设置为3或者4 比较好。 相反,在OLTP系统下,不应该使用动态采样。