网站推广软件有哪些,wordpress企业教程,网站开发查找漏洞的工具,网站内容的设计物理执行计划基本操作符 专栏内容#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发#xff0c;开发的步骤#xff0c;以及开发过程中的涉及的原理#xff0c;遇到的问题等#xff0c;让大家能跟上并且可以一起开发#xff0c;让每个需要的人成为参与者。 本专栏…物理执行计划基本操作符 专栏内容 手写数据库toadb 本专栏主要介绍如何从零开发开发的步骤以及开发过程中的涉及的原理遇到的问题等让大家能跟上并且可以一起开发让每个需要的人成为参与者。 本专栏会定期更新对应的代码也会定期更新每个阶段的代码会打上tag方便阶段学习。 开源贡献 toadb开源库 个人主页我的主页 管理社区开源数据库 座右铭天行健君子以自强不息地势坤君子以厚德载物. 文章目录 物理执行计划基本操作符前言概述扫描表顺序扫描索引扫描 排序扫描代价计算模型计算参数 总结结尾 前言
随着信息技术的飞速发展数据已经渗透到各个领域成为现代社会最重要的资产之一。在这个大数据时代数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而很多读者可能对数据库理论感到困惑不知道如何选择合适的数据库如何设计有效的数据库结构以及如何处理和管理大量的数据。因此本专栏旨在为读者提供一套全面、深入的数据库理论指南帮助他们更好地理解和应用数据库技术。
数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中数据量呈指数级增长如何高效地处理和管理这些数据成为一个重要的问题。同时随着云计算、物联网、大数据等新兴技术的不断发展数据库理论的重要性日益凸显。
因此本专栏的分享希望可以提高大家对数据库理论的认识和理解对于感兴趣的朋友带来帮助。
概述
数据库执行计划的最后一步是生成物理执行计划物理执行计划是由一系列操作节点构成。其中最基本的操作符扫描表一般都是执行计划的叶子节点。
本文主要分享物理执行计划的最基本操作扫描表扫描表时排序以及它的代价计划模型和估算希望大家得到启示感谢各位的浏览和点赞。
扫描表
SQL执行的目的都是要从表里拿到想要的数据一般对于扫描表的节点都会含有一个谓词符合谓词的数据都会被返回。
表对应的数据块一般都会存放在内存缓冲区中扫描表时可以一个接一个的找到。扫描表时可以有多种方法可以选择比如顺序扫描索引扫描仅索引扫描。
顺序扫描
最常见的就是顺序扫描顾名思义就是从表的第一个数据块开始每个数据块从第一个元组开始扫描直到这个块的结尾然后继续下一个块直到所有表的数据块扫描结束。
索引扫描
对于表上建有索引的情况正好谓词对应字段有索引那么可以使用索引避免顺序遍历表的所有数据块。索引的数据也是存放在内存缓存区中遍历索引文件的所有数据块扫描索引数据块上的索引元组。
如果是密集索引就可以直接找到符合谓词的元组在表中的数据块上的位置然后直接访问对应的表数据块从该块的offset处读取元组。
如果是稀疏索引通过索引定位到表的某个位置还需要继续从此位置扫描表直到找到符合谓词的元组。
直到索引文件的所有数据块扫描结束整个扫描就会结束。通常索引文件相比表文件来说小非常多。
对于查询结查字段只有索引字段时此时只用扫描密集索引文件就可以得到元组字段不需要扫描表文件这就是仅索引扫描当然实际应用中会有事务隔离的处理并不是所有情况下密集索引都能使用仅索引扫描。
排序扫描
对于含有order by子句的查询来说扫描表的结果需要以排序的方式返回另外还有一些关系代数的运算需要基于排序的结果所以这就用到了排序-扫描方式。
排序扫描节点的输入是要扫描的表和排序字段的说明在物理执行计划中有很多方式选择。 对于排序字段上含有索引而且是索引是带有顺序如Btree索引或者表数据的存储是按排序字段的顺序存储的此时只进行表扫描或索引扫描即可 对于比较小的表查询结果全部可以装入缓冲区那么可以用常用的排序算法进行排序即可 对于非常大的表查询结果并不能全部装入缓冲区时就需要使用外排通过几趟读写的算法才能完成排序后面分享多路归并算法
代价计算模型
在将逻辑查询计划转换为物理查询计划时我们需要选择执行效率比较高的物理操作符进行执行也可以说是选择最优执行路径。当出现几种执行路径时如顺序扫描索引扫描路径选择时首先对每种操作符的执行代价进行评估才能选出最优的路径。
这是一种基于代价的选择最优路径的模式按什么模型来计算操作符的代价呢下面我们一起看看。
可用的缓冲区都是有限的数据一般都会存储在磁盘上当使用到时会加载到缓冲区缓冲区满时也会利用替换策略将暂时不用的数据置换到磁盘上。
那么在查询的过程中读写磁盘的IO次数会是代价的一个衡量值。同时磁盘的读写IO耗时远远大于内存中的操作所以磁盘代价将占查询成本的大部分这样就可以简化操作符的代价计算为磁盘IO次数的计算。
基于代价的计算模型就生成了下面我们看有那些参数来计算。
计算参数
缓冲区大小(M), 我们假设可用的缓冲区能容纳的数据块为M缓冲区是远远小于物理内存大小的表占用的数据块数量(B), 当我们扫描表时需要一个数据块一个数块的读出这就和表文件所占数据块的多少有关系了,假设表占用了B个数据块那么最多也就会产生B次IO表的元组数量(T), 表中所有元组的数量T/B,就得到了每个数据块上的平均元组数量最差情况是元组数量与块数相同查询列对应的值数量假如查询列为货物类型那么它对应的就是有限类型最差情况是与元组数量相等
以上参数值的不同都会影响我们查询处理时磁盘IO的数目后面会继续分享在扫描算法中的应用。
总结
物理执行计划的最基本节点就是扫描表实际扫描表中有多种方式可以选择通过代价计算模型可以选择最优路径最终执行。
有菜也有肉的分享下面插一段hello world的代码 以下是一个简单的 “Hello world”在初始化函数中输出在main之前会被调用
#include stdio.h __attribute((constructor)) void premain() { printf(Hello, World!\n);
} int main() { return 0;
}结尾 非常感谢大家的支持在浏览的同时别忘了留下您宝贵的评论如果觉得值得鼓励请点赞收藏我会更加努力 作者邮箱studysenllang.onaliyun.com 如有错误或者疏漏欢迎指出互相学习。