【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

本文主要是介绍【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

物理执行计划基本操作符

专栏内容

  • 手写数据库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;  
}

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

这篇关于【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424014

相关文章

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/