深入内核丨12C 新特性之 TOP - N 频率柱状图原理和算法

作者简介

黄玮(Fuyuncat)

资深 Oracle DBA,致力于数据库底层技术的研究,其作品获得广大同行的高度评价。

个人网站 www.HelloDBA.com

在 Oracle 12c 当中,优化器的一个新特性就是提供了新类型的柱状图数据,Top - N 频率柱状图和混合柱状图。优化器利用它们可以更加高效、精确地计算执行计划代价,选择最优计划。这里将探究一下 Top - N 频率柱状图在什么情况下获得、以及它如何影响优化器的选择率的计算。 12c 在线文档描述: Top - N 频率柱状图是频率柱状图的一个变种,它忽略了那些"非流行数据"(即出现频率低的数值)。例如,1000枚硬币中只有一枚面值1分的硬币,那在创建柱状图分组时,它就可以被忽略。Top - N 频率柱状图能产生一个更利于"流行数据"(高频率数据)的柱状图。

如何产生 Top - N 频率柱状图

首先需要了解的一个事实是,在收集统计信息数据时,如果为估算值设置了一个非默认值,则统计数据过程就类似于11G,即不会产生新类型的柱状图。因此,产生 Top - N 频率柱状图的一个必要条件就是让估算比为默认值。

例如:

从在线文档对 Top - N 频率柱状图的描述可知,Top - N 频率柱状图分组数量一定小于唯一值数量(Distinct Value Number)。所以,产生 Top - N 频率柱状图的另外一个必要条件是设置的分组数或者默认分组数设置(默认254)小于其唯一值数。

在进一步为字段收集统计数据之前,统计数据收集过程首先会计算近似唯一值数。这一步骤会调用 SQL 分析器(SQL Analyzer)来分析当前输入参数所产生的一条 SQL 语句。例如如下语句:

SQL 分析器不光会获得这条查询语句的结果,还会根据输入选项(如TOPN, NIL, NIL, ACL, RWID, U25, UU)在执行和分析过程中调用内部函数获取更多的额外信息。其中就有 TOP - N 数值信息。然而,如果 TOP - N 数值的数据总数在该字段的非空值数据总数中的比例低于一个阈值(1-1/MNB,MNB 为最大分组数,Maximum Number of Buckets,它是影响选择频率柱状图还是高平衡柱状图的重要因素,参见http://www.hellodba.com/reader.php?ID=19&lang=EN)时,TOP - N 数据会被丢弃,也就是说,不会产生Top - N频率柱状图。因而,TOP - N 数值的数据总数在该字段的非空值数据总数中的比例大于(1-1/MNB)也成为产生 Top-N 频率柱状图的一个必要条件。

而字段的最大、最小唯一值必须包含在柱状图数据当中,因此统计过程还需要检查是否需要从现有 Top - N 数据中移除数据以容纳最大、最小值:如果最大、最小值已经在 Top - N 数据当中,则不需要移除,否则将数据量最小的数值移除以腾出位置给最大最小值。相应的,要根据调整后的 Top - N 数据记录总数在非空数值记录总数中的比例再与阈值比较以决定是否采纳 Top - N 频率柱状图。 概括产生 Top - N 频率柱状图的条件: 1. 估算比为默认值; 2. 柱状图分组数小于唯一值数; 3.(调整后的 Top - N 数据记录总数)/(非空数值记录总数)>(1-(1/MNB))

演示

以下用一个例子来演示 Top-N 频率柱状图的产生。

可以看到,尽管设置了分组数小于唯一值(30)的25,并采用了默认估算值,统计收集过程最终还是未给该字段收集 Top - N 频率柱状图。检查 Top - N 数据记录总数在非空数值记录总数中的比例以及阈值。

最初计算的 Top - N 数据记录总数在非空数值记录总数中的比例是大于阈值的。再看 Top - N 数据记录总数是否会被调整:

。。。。。。

最小值(1)并没有在最初的 Top - N 数值当中,它要替换 Top - N 数值当中的数据量(60)最少的数(6)。调整后计算得到的百分比为:

因此可以看到该值小于阈值(96),所以不会产生 Top - N 频率柱状图。

基于 Top - N 频率柱状图的选择率计算

基于 Top - N 频率柱状图的选择率计算并不复杂。

1. 如果判定谓词中数据位于柱状图当中,则采用柱状图数据计算选择率; 2. 如果判定谓词中数据不位于柱状图当中,则由柱状图以外的唯一值数及其数据数量来计算选择率。

举例说明:

。。。。。。

注意:因为最小值(1)没有被包含在最初分析的 Top-N 值当中,它替换了里面数据量最少的唯一值(5),并且数据量设置为1。

唯一值20的分组数据量为 200 (1951-1751),计算所得选择率为 200/取样大小 = 200 / 4650,因此,过滤后的数据记录数为 cardinality*selectivity = 200。

"2" 不是一个 Top - N 数值,这一谓词表达式的选择率为该字段的密度(Density)。然而,对于 Top - N 频率柱状图字段,优化器会根据非 Top - N 数值数据重新计算密度。本例当中,新的密度为(非空值总数 - Top - N 数值总数)/(非 Top-N 数值总数)/(非空值总数)= (4650-4501)/(30-26)/4650 = 0.008010753。因此,过滤后的数据记录为 cardinality*selectivity=trunc (4650*.008010753) = 37。

TIPS:新计算所得密度可以通过 10053 事件跟踪观察到。

注:

测试环境为:ORACLE 12.2.0.1 ON WIN10

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

机器学习(五) ——k-近邻算法进一步探究

机器学习(五)——k-近邻算法进一步探究 (原创内容,转载请注明来源,谢谢) 一、概述 现采用k-近邻算法,进行分类应用。数据源采用《机器学习实战》提供的数...

3274
来自专栏企鹅号快讯

GitHub新开放项目FoolNLTK:一个便捷的中文处理工具包

机器之心报道 作者:蒋思源 近日 GitHub 用户 wu.zheng 开源了一个使用双向 LSTM 构建的中文处理工具包,该工具不仅可以实现分词、词性标注和命...

2048
来自专栏AI研习社

用深度学习每次得到的结果都不一样,怎么办?

AI研习社按:本文作者 Jason Brownlee 为澳大利亚知名机器学习专家、教育者,对时间序列预测尤有心得。原文发布于其博客。AI研习社崔静闯、朱婷编译。...

9073
来自专栏媒矿工厂

HDR关键技术:HEVC/H.265编码方案

前文我们对HEVC的HDR编码优化技术做了介绍,侧重编码性能的提升。本章主要阐述HEVC中HDR/WCG相关的整体编码方案,包括不同应用场景下的HEVC扩展编码...

3780
来自专栏编程

用Python进行速度预测

这次分享一段数据特征挖掘准备工作的套路~ 数据格式是这样的: ? task 预测值:速度 特征值: Region 区域 Length 长度Volume 流...

2949
来自专栏QQ会员技术团队的专栏

人人都可以做深度学习应用:入门篇(下)

如果这一轮AI浪潮真的会带来新的一轮科技革命,那么我们相信,它也会遵循类似的发展轨迹,逐步发展和走向普及。如果基于这个理解,或许,我们可以通过积极学习,争取成为...

6.7K2
来自专栏人工智能

如何使用TensorFlow实现神经网络

如果你一直关注数据科学或者机器学习等领域,你肯定不会错过深度学习和神经网络的热潮。许多组织都正在寻找深度学习人才,将深度学习运用于各个领域。从参与竞赛到运用于开...

4479
来自专栏智能算法

Facebook通过10亿单词构建有效的神经网络语言模型

由于在语言识别、机器翻译和语言建模等领域表现出了优异的性能,为序列预测而设计的神经网络最近再次引起了人们的兴趣,但是这些模型都是计算密集型的,成本非...

3725
来自专栏Pytorch实践

简单的搜索引擎搭建

2257
来自专栏深度学习自然语言处理

【论文笔记】中文词向量论文综述(一)

最近在做中文词向量相关工作,其中看了一些中文词向量的相关论文,在这篇文章,将把近几年的中文词向量进展及其模型结构加以简述,大概要写3-4篇综述,每篇包含2-3篇...

912

扫码关注云+社区