可行与高效你选哪个:SQL背后的核心算法

0、概述

经过前面几篇数据库的数据库设计与优化的铺垫之后,一直想着开始进行真正的SQL的优化分析,但是细想下来,还有些工作没有做:其一,数据库管理系统的基本构成全貌,目前仍然缺失的,一直在细节内打转,难免陷入管窥蠡测的困境;其二,对动态的SQL执行大体情况,也是需要进行相应的补充。之后,才能更好地把握数据库的优化。

1、数据库管理系统的构成

首先,从整体上看下一个典型的数据库管理系统的构成:

图1 数据库管理系统的构成

关于这张图,不用太多地纠结其中的细节,只需要在脑海中有个大概得印象,在后续的不断优化实践中,逐步加深对该结构图的理解,甚至不断自己添加更多的细节,我觉得是更好的提升方式。

这里重点看左侧那一栏,前面几篇关于数据库的文章,主要介绍了索引、缓冲区、存储管理器、外存相关的概念。暂时缺失的部分,从用户/应用的提交到执行引擎执行之间的部分。

2、数据库查询的执行

图2 数据库查询执行的相关组件

如图所示,主流的数据关于一条SQL查询语句的执行,一般要经过这些步骤:

  • 客户端通过连接器完成客户连接的建立,连接器同时进行客户权限的校验与连接的管理

  • 解析器需要将客户端提交的SQL语句进行词法分析与语法分析,构建查询语法树,校验是否SQL语句存在语法上的错误

  • 优化器基于查询语法树,结合统计信息、元数据等进行索引的选择,生成逻辑执行计划

  • 执行引擎基于逻辑执行计划生成物理执行计划,物理执行计划包括算法的选择,基本算子的转换组合等

需要注意的是,有些地方把解析器和优化器统称为查询编译器,类似于编程语言的编译,然后执行的叙述方法。

此外,对于类似于MySQL的数据库,分为Server层和存储引擎层,Server层中的执行器需要调用存储引擎来进行最终的物理查询计划的执行。

3、物理查询计划的基本算子

需要明确的,在我们当前的语境中,所谓的主流数据库管理系统一般指的是关系型数据库管理系统(RDBMS)。

而RDBMS的设计原理的核心是关系代数,所以在RDBMS中,每一条查询语句,都可以转换为一组基本关系代数运算的排列组合。常见的关系代数运算有:选择、投影、连接、积、交、并、差等。

物理查询计划中,则通过存储管理器的一些基本算子组合实现对应的关系代数运算,继而排列组合,最终构建出与查询SQL语句等价的物理查询计划。

物理查询计划中的基本算子主要有:

图3 物理查询计划的基本算子

基本是与关系代数运算是一一对应的。其中,扫描表是最基础、最核心的算子,其他算子都需要基于该算子进行实现。

4、核心算法

迭代器

由于数据库表的存储通常是在外存中,而且是物理上是以数据块为单位进行连续存储的,所以主要的算子都可以使用迭代器的方式进行算法的实现。

通常意义上,迭代器由3个方法组成:

  • Open():用于启动获得数据元组(即表数据记录)的过程,但并不真正获得元组,主要执行需要获取元组的相关初始化

  • GetNext():返回下一个元组,并且对数据结构做必要的调整,以便进行后续的操作。如果过已经迭代完成,没有更多的元组了,这时可以返回一个特殊值NotFound,确保不会与任何元组混淆

  • Close():执行终结迭代相关的清理工作

两阶段多路归并排序(Two-Phase Multiway Merge-Sort, TPMMS)

虽然,我们在前面反复提到,数据库设计与优化的指导原则是尽量减少IO操作,但是在数据量过大,无法在内存中完成SQL所需的计算工作时,为了确保SQL能够被正确执行,反而需要更多的借助磁盘,不可避免地,自然会增加磁盘IO操作。

其中,TPMMS就是其中,最基础、最核心的算法:

  • 阶段1:不断将数据库表中的每个元组子集放入内存缓冲区,利用主存排序算法对它们进行排序,然后将排序后得到的有序子表存储到外存中

  • 阶段2:将多个排序好的子表进行归并操作,此时,为每个局部有序的子表各分配一个内存输入缓冲区,将数据按序分步加载到各自的输入缓冲区,从多个输入缓冲区中选择最小的(假设是进行升序排序),加载到输出缓冲区。输出缓冲区中的数据一定是全局有序的,可以立马返回给客户端的数据段。

图4 TPMMS示意图
基于TPMMS的两趟算法的扩展

虽然TPMMS是基于外存的多路归并排序而实现的排序算法,但是借助外存进行的多路归并的策略,可以更广泛地应用于数据库各种基本算子的二趟算法中。

算法分类:

基于能否借助内存只需要从磁盘读取每个数据一次,将相关的查询算子的实现算法分为一趟算法(one-pass)、两趟算法,以及多趟算法。通常两趟算法对大多数场景,已经够用,多趟算法基于二趟算法可以轻易推导出来。

在数据库基本算子的实现算法中,又可以按照具体实现,分为以下三类:

  • 基于排序的算法

  • 基于散列的算法

  • 基于索引的算法

二趟排序中,基于排序的去重、基于排序的分组、基于排序的集合运算等,都类似于TPMMS的实现逻辑。

此外,基于散列的去重、基于散列的分组、基于散列的集合运算等,也类似于TPMMS的实现,只是各个子表不是进行排序,而是基于哈希操作,将数据分为多个子表,每个子表的哈希值相同而已。

关于数据库查询中,最常用的数据库连接操作的具体实现,也是基于一趟算法的嵌套循环、二趟排序、二趟散列等的组合实现,具体实现在这篇文章中就不再展开。

5、参考书籍

1、《数据库系统实现(第2版)》

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
仓库管理系统数据库设计 1概述(设计题目与可行性分析) 1.1设计题目 设计一个仓库数据库管理系统,要求实现入库、出库、库存和采购等功能。 随着经济的飞速发展,,仓库管理变成了各大公司日益重要的内容。仓库管理过 程的准确性和高效性至关重要。影响着公司的经济发展和管理。利用人工管理强大而 数据烦琐的数据库显的效率过于低。利用计算机高效、准确的特点能够很好的满足公 司的管理需要。提高公司各个员工的工作效率和公司的运做效率。利用计算机对仓库 数据信息进行管理具有着手工管理所无法比拟的优点。目前一个现代化的仓库管理系 统已经成为仓库管理不可缺少的管理手段。 1.2 可行性研究 可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决 。可行性研究的目的不是解决问题而是分析问题能不能解决;至少从下面三个方面分 析可行性研究。 1.2.1技术可行性 该仓库数据库管理系统不不是很复杂,设计实现该数据库技术难度不是很大,利 用目前现有的技术和工具能在规定的时间内做出该系统。该系统利用SQL2000和visu al studio工具就能很好的实现该系统。 1.2.2经济可行性 当今世界是经济时代,一个公司的员工工作效率的高低直接影响着这个公司的发 展。因此利用计算机进行信息管理有着无可比拟的好处,该系统相对较小,代码行较 少,数据库设计不是很麻烦,开发周期较短。而且便于维护。但其带来的经济效益远 远高于其开发成本。在经济上是可行的。 1.2.3 操作可行性 在当今社会,随着义务教育的普及。和计算机的普及,公司的员工基本上都会进 行电脑的基本操作,由于本软件系统采用相对友好的界面,用户在使用过程中不需要 懂太多的电脑专业知识,只需要基本的电脑操作就可以操作本仓库管理系统软件。公 司可以在员工上岗之前进行简单的电脑操作培训。例外本系统附带操作说明手册供用 户查找。因此在操作上可行的。 2系统目标和建设原则 2.1系统目标 仓库管理系统主要是为仓库管理人员提供仓库货物的信息的相关的记录、查询和 统计功能为管理人员提供重要的信息参考。通过仓库管理系统,仓库管理人员可以对 货物的入库、出库、以及库存信息等进行管理,同时系统提供方便的货物管理信息的 查询和统计功能,能够满足仓库管理人员的基本管理需求。 系统开发的总体任务是实现物资设备管理系统化、规范化和自动化,从而达到提 高单位工作效率的目的。 2.2建设原则 管理仓库管理各种信息的输入,包括货物的入库、出库、还库、发货、接收信 息的输入等。实现仓库管理相关各种信息修改和维护。实现仓库管理现场实时信息的 查询统计。管理仓库的各种物料信息。操作日志的管理,系统能自动记录所进行的各 种操作。实现多种统计报表,支持分析与决策支持。制定科学的权限划分,保证系统 的使用安全。该系统的可移植性要强。 3支撑环境规划 3.1 网络逻辑结构 为了保证数据库系统的安全,所设计的数据库建立在三层的B/S体系结构上。三 层B/S结构是将应用功能分成表示层、功能层是数据层三部分。表示层是应用的视图 部分,担负着用户与应用层的对话功能。在变更用户接口时,只需要改写显示控制和 数据检查程序,而不影响其他两层。功能层相当于应用的本体,它是将具体的业务处 理逻辑编入程序中。数据层就是数据库管理系统,负责对数据库数据读写。数据库管 理系统必须能迅速大量处理的更新和检索。因此,一般从功能层传到数据层的要求大 都使用SQL语句。 3.2 软件支撑环境及开发工具 本系统是在windows平台下开发。软件支撑环境:windows操作系统。MS SQL2000个人版visual studio开发工具。 该仓库数据库管理系统服务端建议运行在 P4 内存:512M 硬盘:80G的服务器上。 4系统需求分析 4.1 总体DFD 4.2 功能结构(功能结构图,主要功能)。 本仓库管理系统主要为仓库管理人员和采购人员设计使用,因此本系统需要运行 在网络环境中,考虑到安全问题和公司的经济利益等问题故其网络环境主要是本地局 域网。因此本系统的界面设置尤其重要,应当充分贯彻简单易用、美观大方的原则。 系统采用结构化的设计方法进行设计。仓库管理系统要实现的基本功能如下:采购、 入库、出库和库存管理。 货物的入库功能模块:该功能模块主要实现的功能有:对入库货物进行相关信息 的记录,货物的名称,产品编号,生产日期,入库日期,入库操作员,货物采购员等 。该管理功能模块在入库操作过程中先要查询数据库中是否有本货物存在如果有将该 货物累加,否则将创建该货物。 货物的出库功能模块:该功能模块主要实现的功能有:对出库货物进行相关信息 记录。包括货物名称,编号,生产日期,出库日期、出库管理操作员,货物提走人员 等。 货物的采购功能模块:统计仓库数据库中各个货物的数量,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值