算法分析:Oracle 11g 中基于哈希算法对唯一值数(NDV)的估算

为什么引入新 NDV 算法

字段的统计数据是 CBO 优化器估算执行计划代价的重要依据。而字段的统计数据可以分为两类:

1. 概要统计数据:如 NDV 字段平均长度 ACL 最大、最小值等

2. 柱状图数据:也叫直方图(histograms)记录 NDV 和它们出现的频率

NDV 也叫做唯一值数,是对表的字段唯一值个数的统计,对于第一类数据,实际上可以通过一次扫描表获取所有字段的统计数据。

但是,对于大型表的分析,为减少资源消耗,需要通过采样分析。由于采样具有随机性,对于一些数据分布不均匀的字段,通过采样数据获取统计数据可能会导致获取到的数据与实际数据产生较大差异

尤其对于一些海量数据表,通常采样比较低,因而每次分析对象获取到的数据的精度会存在较大的不确定性。这种不确定性可能会对系统的整体性能造成重大影响。

举个例子

一个字段的里面的数据如下:

[0,1,1,1...(100*1)...1,2,3,4,5,6,7,8,9]

其实际的 NDV 是10,通过采样(假设采样比为10%)获取 NDV 时,由于采样的随机性,可能就会出现以下情况:

[1...(10*1)...,2,6]

得到的 NDV 是3,和实际值存在很大的出入(如果除以采样比的话,NDV 为3/10×100=30)。而如果优化器采样了这样数据进行执行计划代价估算的话,就很有可能获取不到最优的执行计划。

而降低这种不确定性的手段就是提高采样比例。但是,对于大型表来说,提高采样比又会带来更多的资源消耗,尤其是获取 NDV 数值时。

由于获取 NDV 数值需要消除重复值(通过 count (distinct col) 方式获取),Oracle 是通过排序的方法将已经读取的唯一值保持在 PGA 当中,以便消除后续的重复值。因此,当取样比增加时,PGA 的消耗也会线性增加

对于大型表,PGA 可能不足以容纳全部数据,从而会导致临时磁盘空间的读写,导致重大的性能问题

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

新 NDV 算法介绍

在11g中,采用了一种新的算法消除 NDV 计算时,数据量与 PGA 消耗之间的线性关系,从而使得通过完全扫描表获得精确统计数据成为可能。因此,在 11g,自动采样模式下不再进行快速取样,而是直接进行全表扫描获取统计数据。这一新算法称为唯一值数估计(Approximate NDV)。

默认情况下,在进行自动采样时,也就是 AUTO _SAMPLE_SIZE 时,就采样该算法。

这个新特性也可以通过隐含参数 "APPROXIMATE _NDV" 来关闭。

SQL 代码:

HELLODBA.COM>exec dbms_stats.set_param('APPROXIMATE_NDV','FALSE');

PL/SQL procedure successfully completed.

注意:11g 中,对分区表全局统计数据的增量(INCREMENTAL)计算方式,也是利用了该算法。

新NDV算法过程






该算法充分利用了哈希算法的分布均衡特性。其基本算法过程如下:

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在签名算法使用哈希算法计算哈希值而不是直接签名有以下原因: 1. 数据长度不受限制:签名算法通常使用非对称加密算法,而非对称加密算法的性能相对较低。如果直接对整个数据进行签名,无论数据大小如何,都需要执行相同的加密操作。而使用哈希算法计算哈希值,可以将任意长度的数据压缩成固定长度的哈希值,从而提高了签名和验证的性能。 2. 效率和速度:哈希算法通常比非对称加密算法更高效和快速。哈希算法能够快速计算数据的摘要(哈希值),而非对称加密算法需要进行复杂的数学运算。因此,使用哈希算法计算数据的摘要能够提高签名和验证的效率和速度。 3. 数字签名长度固定:签名长度不受原始数据长度影响,因为哈希算法生成的哈希值通常是固定长度的。这样,在验证签名时,无论原始数据有多长,都只需要对固定长度的签名进行解密和比对。 4. 安全性:哈希算法具有抗碰撞性,即使输入数据发生微小的改变,其哈希值也会有较大的变化。通过对哈希值进行签名,可以确保数据的完整性,即使数据发生细微的改变,也会导致签名验证失败。这种特性可以防止篡改和伪造。 综上所述,使用哈希算法计算哈希值是为了提高签名算法的性能、效率和安全性。通过计算数据的哈希值并对哈希值进行签名,可以保证数据的完整性、固定签名长度和提高签名和验证的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值