全面解读 SQL 优化 - 统计信息

news2024/12/26 15:59:53

 一、简介

数据库中的优化器(optimizer)是一个重要的组件,用于分析 SQL 查询语句,并生成执行计划。在生成执行计划时,优化器需要依赖数据库中的统计信息来估算查询的成本,从而选择最优的执行计划。以下是关于数据库中优化器统计信息的简介:

(1)统计信息概述

统计信息是描述表或索引中数据分布情况的元数据。这些信息包括行数、数据分布、重复值等,都是优化器选择执行计划的关键因素。

(2)统计信息来源

统计信息被收集并存储在数据字典中,可以通过特定的 SQL 命令(如 ANALYZE TABLE)来手动收集;也可以被自动收集,以保持数据字典的最新状态。

(3)统计信息类型

统计信息包括两种不同类型的信息,系统级别和对象级别。系统级别的统计信息是全局性的,如整个数据库中所有表的平均行长度;而对象级别的统计信息是特定对象的信息,如表或索引的平均行长度、列值的分布和直方图等。

(4)统计信息用途

优化器使用统计信息作为计算成本的基础,从而选择最优执行计划。优化器所使用的统计信息包括表的行数、每个列的唯一值数目、平均列长度等。

(5)统计信息更新

数据的分布会随着时间和数据量的增长而发生变化,因此统计信息也需要定期更新。更新统计信息的频率取决于表中数据的变化速度和查询的要求。

总之,优化器统计信息是一个关键的组件,用于执行计划的生成和执行。数据库管理员需要定期维护和更新统计信息,以支持数据库的正常运行和高效执行 SQL 查询。

目前 KaiwuDB 维护的统计信息包括表和列的统计信息,这是本期技术贴重点介绍的内容。

➢ 表的统计信息:总行数;

➢ 列的统计信息:不同值的数目,NULL 值的数目和直方图。

二、统计信息流程

生成统计信息的简单流程如图所示,详细采样过程由后文部分介绍。

  • Sampler("采样器"处理器的规范)

该处理器返回输入列的样本(随机子集)并计算列集上的基数估计草图 。

  • SampleAggregator(处理器的规范)

该处理器聚合来自多个采样器处理器的结果,并将统计信息写到 system.table_statistics 中。

三、基数统计算法

HyperLogLog 是一种基数(cardinality)估计算法,用于在海量数据中估计不同元素的数量。该算法使用了概率技巧和哈希函数,可以在极大数据量下高效地统计基数。以下是关于 HyperLogLog 的简介:

  • 基数(cardinality)

基数是指集合中不同元素的数量。例如,在某个网站上的用户访问记录中,基数表示的是不同的用户数量;

  • 精确计数局限

对于大规模数据,精确计算基数的代价会非常昂贵,因为需要遍历整个数据集,消耗大量计算资源和时间;

  • 算法原理

HyperLogLog 利用了哈希函数和概率的原理,将输入的元素通过哈希函数映射到一个固定大小的二进制空间,并计算这些哈希值的最大前缀 0 的位数。然后,将这些最大前缀 0 的位数的平均值作为基数的估计值;

  • 精度控制

HyperLogLog 的精度受哈希函数的影响,可以通过调整哈希函数的参数来控制精度。一般来说,HyperLogLog 算法可以在仅占原始数据 1-2% 的空间下,对基数进行非常准确的估计,误差通常在 1% 以内;

  • 应用场景

HyperLogLog 广泛应用于大规模数据的基数统计,如页面访问、IP 地址统计、社交网络中用户数量估算等。

总之,HyperLogLog 算法是一种高效的基数统计算法,可以在大规模数据下进行快速而准确的基数估计,具有广泛的应用前景,以下将为大家介绍 KaiwuDB 是如何进行实现的。

主要计算:2 的第一个 0 出现位置次方的调和平均值

1. 算法步骤

(1)转化为比特串

通过哈希函数,将输入的数据转化为 64 位比特串,哈希函数将 2^64 个不同值映射到 0~2^64-1 地址上。比特串中的 0 和 1 可以类比为硬币的正与反,这是实现估值统计的第一步;

(2)分桶平均

首先初始化数据结构 sketch,包括分桶数、修正系数等。然后将每个元素的 hash 值取最后的 p 位决定桶的编号,在剩余的(64-p)位中找到最大的第一个"0"出现的位置;

(3)计算调和平均数

所有元素处理完毕后,求所有桶中值的调和平均数即可得到 distinct 值。

2. 估算流程

HyperLogLog 是 KaiwuDB 统计信息中计算 Distinct 值的主要估计算法。下图为详细流程:

3. 算法优势

利用尽可能少的内存空间实现大数据集的基数统计。

  • 2^14桶

Go
root@:26257/defaultdb> select count(*) from t1;
  count
---------
  10000
(1 row)

Time: 3.300613ms

root@:26257/defaultdb> Show statistics for table t1;
  statistics_name | column_names |             created              | row_count | distinct_count | null_count |    histogram_id
------------------+--------------+----------------------------------+-----------+----------------+------------+---------------------
  t1s             | {c1}         | 2023-05-28 00:53:09.573502+00:00 |     10000 |           9920 |          0 | 868891982501675009
(1 row)

Time: 2.021244ms
  • 2^16桶

Go
root@:26257/defaultdb> select count(*) from t1;
  count
---------
  10000
(1 row)

Time: 4.210306ms

root@:26257/defaultdb>  Show statistics for table t1;
  statistics_name | column_names |             created              | row_count | distinct_count | null_count |    histogram_id
------------------+--------------+----------------------------------+-----------+----------------+------------+---------------------
  t1s             | {c1}         | 2023-05-28 01:02:29.997638+00:00 |     10000 |           9999 |          0 | 868893818901430273
(1 row)

Time: 3.056793ms

桶的个数越多,HyperLogLog 的精度就越高,同时所占用的内存也越大。

四、 蓄水池算法

蓄水池算法(Reservoir Sampling)是一种在数据流中随机采样的算法,常用于生成一个固定大小的随机样本。以下是关于蓄水池算法的介绍:

(1)数据流

在大规模数据处理中,数据通常以数据流的形式出现,即数据无法事先被全部存储下来,而必须通过流式处理方式来逐个处理;

(2)算法原理

蓄水池算法需要维护一个大小为 k 的蓄水池,初始时将前 k 个元素放入蓄水池中,然后对于第 i 个元素,有 1/i 的概率将其替换蓄水池中的任意一个元素;

(3)采样理论

根据采样理论,该算法可以保证每个元素被采样的概率都相等,即 1/n,其中 n 为数据流中元素的数量;

(4)应用场景

蓄水池算法广泛应用于随机采样问题,如从海量数据中随机选取 k 个元素进行分析、从实时日志数据中随机选取一部分数据进行监控等;

(5)算法优点

蓄水池算法具有高效、可扩展、精度高等优点,并且能够在空间与时间复杂度上做到线性级别。

总之,蓄水池算法是一种高效的随机采样算法,可以在数据流中进行随机采样,并保证每个元素被选中的概率都相等,具有广泛的应用前景,以下内容为蓄水池算法在 KaiwuDB 中的实现流程。

在 mainloop 函数中通过蓄水池抽样算法,来生成均匀抽样集合。 

采样过程的 processor 有 sampler 和 sampleaggregator 都采用了采样模块。

其中 sampler processor 的输入为 tablereader 下读取到的数据,是未经任何采样的数据;sampleaggregator processor 输入为各个 sampler processor 的取样结果,是经过采样的数据。

五、直方图计算流程

直方图是一个描述数据分布情况的工具,KaiwuDB 采用等深直方图。

根据采样得到的样本进行直方图的创建,创建方法大致如下(详情参考EquiDepthHistogram函数):

将样本排序,顺序遍历每一个值 V:

  • 如果 V 等于上一个值,那么把 V 放在与上一个值相同的一个桶里,无论桶是不是已经满,这样可以保证每个值只存在于一个桶中;

  • 如果 V 不等于上一个值,那么需要判断当前桶是否已经满,如果不是的话,就直接放入当前桶;否则,就放入下一个桶。

创建完毕,在函数 writeResults 中将结果存储在 system.table_statistics 中。

六、应用统计信息计算选择率

选择率表示一个查询根据谓词选择出元组的占比,主要用于优化器预估选择的元组的大小,从而进一步选择出最优的执行计划。

主要流程:当一个过滤条件输入进来时,根据其谓词表达式判断对应的列适用于哪些过滤率的计算方式,然后根据收集到的统计信息与计算方式相结合,得到最终的过滤率。

应用直方图和 distinct count 为每个列应用过滤的公式:

SQL
selectivity = (output row count) / (input row count)
其中:
output row count = nonNullSelectivity*输入的非空值数量  + nullSelectivity*输入空值数量
input row count:该列总行数
nonNullSelectivity:桶过滤后的非空值行数/桶过滤前的非空值的行数
nullSelectivity:过滤前后空值的占比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解什么是分辨率

分辨率是对显示屏或相机传感器中可以包含的像素(图片元素或单个颜色点)数量的测量。实际上,分辨率描述了图像或图片的锐度或清晰度。它以水平和垂直方向上可显示的像素数来表示。 表示的分辨率:显示器、打印机和音频 在大多数显示…

外包公司干了2个月,技术倒退两年...

先说一下自己的情况,本科生,19年通过校招进入杭州某软件公司,干了接近3年的功能测试,今年8月份,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年的功能测试…

JOSEF约瑟DZJ-402 DZY-401导轨式中间继电器 触点形式 两转换 AC、DC220V

DZY(J)-400导轨式中间继电器 系列型号 DZY、DZJ-401 DZY、DZJ-402 DZY、DZJ-403 DZY、DZJ-404 DZY、DZJ-405 DZY、DZJ-406 DZY、DZJ-407 DZY、DZJ-408 DZY、DZJ-409 DZY、DZJ-410 DZY、DZJ-411 DZY、DZJ-412 DZY、DZJ-413 DZY、DZJ-414 DzY、DZJ-415 DZY、DZJ…

嵌入式学习笔记(34)S5PV210中断处理的编程实战

6.8.1中断控制器初始化 主要工作有:第一阶段绑定异常处理程序到异常向量表;禁止所有中断源;选择所有中断类型为IRQ;清理VICnADDR寄存器为0。 为什么要禁止所有中断源: 因为中断一旦打开,因为外部或硬件自…

秦时明月卡牌版攻略,最强的推图阵容推荐

这篇文章提供了关于秦时明月卡牌版游戏最强推图攻略2023的详细信息,以帮助玩家在游戏中创建最强的推图阵容。让我们一起来看看这些新的信息吧。 关注【娱乐天梯】,获取内部福利号 秦时明月卡牌版强大的推图组合提议 推图游戏中,绝对不可忽视的…

ros使用rviz订阅Image类型话题,显示yolov7目标检测结果

开发板深度相机系统Xavierrealsense D455ubuntu18.04 1、首先启动yolov7的ros节点,发布话题/image。 2、终端输入rviz,回车打开rviz,Add——>Image: 3、展开Image选项,选择要订阅的topic,左下角就显示出…

中秋佳节,华为手机如何拍月亮?

今年中秋你在哪里过?又到中秋佳节月圆夜,一年一度最期待的拍月亮环节来了!分享几个华为手机拍月亮小技巧,共赏中秋月色~

【Vue2.0源码学习】生命周期篇-挂载阶段(mount)

文章目录 1. 前言2. 挂载阶段分析3. 总结 1. 前言 模板编译阶段完成之后,接下来就进入了挂载阶段,从官方文档给出的生命周期流程图中可以看到,挂载阶段所做的主要工作是创建Vue实例并用其替换el选项对应的DOM元素,同时还要开启对…

DIY手工坊商城小程序的作用有哪些

自己动手做的东西往往更具自豪感,也能锻炼自身的动手能力,而DIY手工坊无疑是小孩子、年轻人喜欢的地方,无论自己做还是成品都具备自由性、不受规格类型局限,比如手机壳、绘画、手工积木、雕塑等。 而对商家来说,经营收…

赋能工业数字化转型|辽宁七彩赛通受邀出席辽宁省工业互联网+安全可控先进制造业数字服务产业峰会

2023年9月25日下午,由软通动力信息技术(集团)股份有限公司主办的“工业互联网安全可控先进制造业数字服务产业峰会”在辽宁沈阳顺利举办。省市区各级政府、科研院所领导、技术专家、企业高管以及生态合作伙伴代表等齐聚一堂,共同探…

Konva事件机制

前言 不同于HTML或SVG标签可以直接绑定事件,Canvas是使用JavaScript来绘制内容,这意味着其内容没有具体的DOM,所以Canvas渲染引擎都会自己实现一套事件机制。Konva的事件机制支持图形的选中、拖拽等交互处理,同时还支持单个图形对…

微信小程序案例2-1:学生信息

文章目录 (二)准备图像素材(三)编写小程序页面结构 单击[确认] 清空页面结构文件index.wxml内容 修改页面配置文件index.json,不适用navigation-bar组件 删除全局配置文件app.json,删除渲染器配置&a…

一键开启默认打印机共享功能,如何用powershell编写一个一键开启windows本地默认打印机共享的脚本

环境: Win10 专业版 Win11专业版 powershell 问题描述: 一键开启默认打印机共享功能,如何用powershell编写一个一键开启windows本地默认打印机共享的脚本 解决方案: 修改Windows注册表来实现打印机共享:(未成功)打开注册表编辑器:按下Win + R组合键,输入"re…

手机,汽车大卖背后,华为生态进入发展新阶段

监制 | 何玺 排版 | 叶媛 从8月底至今,华为手机、汽车的热度就没有消退过。 如今的华为产品,从手机到AR眼镜,从智慧屏到汽车,几乎全线都处在一机难求、一车难求状态。 9月25日举行的华为秋季全场景新品发布会, 更是…

实验三十三、三端稳压器 LM7805 稳压性能的研究

一、题目 LM7805 输出电压、电压调整率、电流调整率以及输出纹波电压的研究。 二、仿真电路 电路如图1所示。集成稳压芯片采用 LM7805CT。 三、仿真内容 (1)测量图1(a)LM7805CT 的电压调整率,测量条件为 I O 50…

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同,区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点,并相互指向,在第一次添加节点时,不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…

算法与数据结构-Trie树

文章目录 什么是“Trie 树”?如何实现一棵 Trie 树?Trie 树真的很耗内存吗?Trie 树与散列表、红黑树的比较 什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符…

SolidWorks 入门笔记03:生成工程图和一键标注

默认情况下,SOLIDWORKS系统在工程图和零件或装配体三维模型之间提供全相关的功能,全相关意味着无论什么时候修改零件或装配体的三维模型,所有相关的工程视图将自动更新,以反映零件或装配体的形状和尺寸变化;反之&#…

软考高级之系统架构师之计算机基础

概述 今天是9月28日,距离软考高级只剩37天,加油! 概念 三种周期: Clock Cycle:时钟周期,CPU主频,又称为时钟频率,时钟周期是时钟频率的倒数Instruction Cycle:指令周…

人工智能 与 搜索引擎的较量

随着科技的不断进步,人工智能(AI)已经渗透到了我们生活的方方面面,搜索引擎也不例外。AI与传统搜索引擎之间的较量成为了科技界和互联网用户关注的热点话题。 人工智能 与 搜索引擎的较量 A - 搜索引擎B - 人工智能AI 的优势理解力…