但是,对于大型表的分析,为减少资源消耗,需要通过采样分析。由于采样具有随机性,对于一些数据分布不均匀的字段,通过采样数据获取统计数据可能会导致获取到的数据与实际数据产生较大差异。
举个例子
一个字段的里面的数据如下:
[0,1,1,1...(100*1)...1,2,3,4,5,6,7,8,9]
其实际的 NDV 是10,通过采样(假设采样比为10%)获取 NDV 时,由于采样的随机性
由于获取 NDV 数值需要消除重复值(通过 count (distinct col) 方式获取),Oracle 是通过排序的方法将已经读取的唯一值保持在 PGA 当中,以便消除后续的重复值。
因此,在 11g,自动采样模式下不再进行快速取样,而是直接进行全表扫描获取统计数据。这一新算法称为唯一值数估计(Approximate NDV)。
(S) ,纲要分裂次数称为级数 (I)
而 NDV 的估算公式是:NDV = S*2^I
在这种算法下,由于每个字段在 PGA 中仅保存一个纲要数据结构,因此,它不会随着读取的数据量的增加而导致 PGA