数学之美:SQL语句的编译与关系代数

news2024/11/24 6:44:27

引言

当年读书的时候,真正学到数据库的操作之前,先学的内容是关系代数运算,以及相关的关系代数的定律。然后知道了当前比较主流的数据库都是关系型数据库,其底层依赖的是关系代数。

但是,当年考试的时候,只涉及到将SQL语句与关系代数表达式之间进行互相转换,却始终不知道关系代数有啥用,明明SQL语句已经很直观了。

随着对数据库的学习、使用的深入,终于知道了关系代数的用途,并体会到了其中的数学之美。

SQL执行前的准备工作

类似于Python、Java等高级编程语言,从代码到程序的执行,需要进行词法分析、语法分析、解释或者编译等处理工作。一条SQL语句的执行,其实也需要对应的分析与编译工作。

完整的步骤

我们首先来看解析器和优化器的工作,这些工作主要涉及到:

  • 词法分析,获取语法成分

  • 语法分析,构造语法分析树

  • 生成并选择相对更优的逻辑执行计划

  • 生成物理执行计划

这些工作中,我们重点看这两个主要的环节:从SQL语句到语法分析树,以及从语法分析树到逻辑执行计划。

从SQL到语法分析树

基于数据库实现中相应的解析规则,解析器检查一条SQL语句,并将其转换为一个语法分析树:

语法分析树的节点主要有以下两种:

  • 原子:词法成分或者其他模式成分,比如关键字(如SELECT)、表(关系)或者字段(属性)的名字、参数、括号、运算符等

  • 语法类:一个查询中起相似作用的查询子成分所形成的族的名称,通常用尖括号括起来表示语法类,比如<Query>表示常用的select - from - where形式的查询、<Condition>表示属于条件的任何表达式等,每一个语法类一般会有多个语法规则。

比如,我们有这样一张表:

create table t_customer(
  id int not null auto_increment comment '会员id',
  name varchar(32) comment '会员姓名',
  gender tinyint not null default 0 comment '会员性别:0未知,1男,2女',
  city varchar(32) comment '会员所在城市',
  primary key(`id`),
  key `idx_city` (`city`)
) comment '会员信息表';

我们将要执行的是这样一条SQL语句:

select 
  id,name 
from 
  t_customer 
where 
  city = '合肥' 
  and gender = '1'

则经过相应的词法分析、语法分析,我们会得到大概这样一棵语法分析树:

其中,以尖括号<>括起来的部分是语法类,黄色的部分为原子。由上面这棵语法分析树可以看出,所有的叶子节点都是原子。对这棵树从左向右,依次遍历各个子树的叶子节点,拼接起来,就是完整的SQL语句。

构造语法分析树的过程,是应用、检查各条语法规则的过程,出现了所有语法规则都不适用的情况时,则说明该SQL语句存在语法错误。

从语法分析树到逻辑执行计划

到这里,就可以回答我在引言中抛出的问题,关系代数将要登场。从语法分析树到逻辑执行计划要分为两步:

  • 将语法分析树转换为对应的关系代数表达式,比如<SelList>要做的其实是关系代数中的投影操作,<Condition>要做的是关系代数中的选择操作

  • 应用关系代数的定律,将基于语法分析树得到的关系代数表达式,转换为任何等价的关系代数表达式,然后基于统计信息,评价各个关系代数表达式的执行代价,从而选出代价最小的关系代数表达式,作为相对最优的逻辑执行计划。

关于关系代数的定律,这里不做过多展开,简单类比为小学数学学过的数学定律就行,比如:交换律、结合律、分配律等。基于这些定律,我们可以交换一个关系代数表达式中的各个操作的顺序,从而得出等价的关系代数表达式。

这一步,也是优化器要做的至为关键的一个操作。

关于关系代数定律的应用,相对来说,比较直观的是在选择和投影中的下推优化。

从直观印象上,也就是提前进行条件的过滤以及字段的选择,从而从一开始就降低磁盘IO的工作量,而不是一股脑把所有的数据从磁盘上读一遍,然后才进行各种筛选过滤。

一个不可回避的问题

关于运算代价的估算,是优化器进行优化选择时的关键所在。

而优化器进行运算代价的估算,主要是基于数据库中的相关统计信息,这些统计信息更多的又主要是各个索引结构的统计信息。

但是,由于统计信息的计算不是实时的,毕竟数据量比较大的话,统计信息的实时更新也是一个成本很高的工作。所以,一般索引信息的更新,只有在insert和update操作中才有可能触发,而且,也不是没执行一条insert或者update语句就立马更新,而是有一个触发机制,比如,当前表中数据累计被更新的占比等。

由于统计信息不是实时的,有时候可能会误导优化器的选择,尤其表的更新、删除操作比较频繁时。

所以,当一条SQL执行效率比较慢时,我们需要分析对应的执行计划,发现某个索引结构如果生效的话,本可以更高效执行,但是数据库管理系统却没有应用时,则可能是统计信息不够及时,这时可以人工介入SQL执行计划的调整,比如MySQL中的force index来强制应用某个索引结构。

由于数学定律对大多数人来说比较生涩,对我也是,这里就不再费力的展开了。很多在读书时期,知其然,不知其所以然的东西,在日用中,能渐渐地变得更加清晰的感觉,很是美好,进一寸有一寸的欢喜!

计算机能解的问题,一定是可以转换为数学问题的问题。从数据库中优化器的优化决策中关系代数的应用,我们能稍微感知到一点点数学之美,从而不再对数学避之唯恐不及,就已经足够了。

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

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

相关文章

【C语言】C语言-体育彩票的模拟生成和兑奖(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

研导智能科技——AI辅助科研产品开发

人工智能&#xff08;AI&#xff09;技术的飞速发展为科研领域带来了革命性的变化。本公司致力于开发基于人工智能的科研辅助产品&#xff0c;旨在通过智能化手段提高科研人员的工作效率和研究质量。目前&#xff0c;我们成功开发了研导学术平台&#xff08;www.zhiyanxueshu.c…

Clickhouse启动失败定位

Clickhouse启动失败定位 1. 定位问题 查看状态 systemctl status clickhouse-server2. 查看日志 在这里插入代码片3. 发现是磁盘不够&#xff0c;进一步查看磁盘信息 df -h 目录4. 查看目录存储信息 du -h --max-depth1 /data/clickhouse5. 进行磁盘清理

VMware每次打开网络设置都出现需要运行NetworkManager问题

每次打开都出现这个情况&#xff0c;是因为之前把NetworkManager服务服务关闭&#xff0c;重新输入命令&#xff1a; sudo systemctl start NetworkManager.service或者 sudo service network-manager restart 即可解决&#xff0c;但是每次开机重启都要打开就很麻烦&#xf…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用&#xff0c;但与 Rollup、Snowpack 等工具类似&#xff0c;Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比&#xff0c;构建 NPM 库时需要注意&#xff1a; 正确导出模块内容&#xff1b;不要将第三方包打包进产…

面了英伟达算法岗,被疯狂拷打。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

Websocket解析及用法(封装一个通用订阅发布主题的webSocket类)

1、什么是WebSocket? websocket的目标是通过一个长连接实现与服务器全双工&#xff0c;双向的通信。是一种在单个TCP连接上进行全双工通信的协议&#xff0c;使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在 js中创建websocket…

改机软件有哪些?实现一键新机、改串号、改IMEI和手机参数的需求 硬改手机软件,新机环境模拟 设备伪装,一键改机,一键复原

这次针对可以直接开端口修改参数的机型做一些工具解析 前面接触合作过很多工作室。其中很多工作室对于各自软件的跳验证有各自的需求。 一个机型各项参数一般有IMEI WiFi 蓝牙 sn psb ESN等等。 针对这些参数的修改首先要明白各自软件检测的具体是哪些参数来验证。 对于常用…

解决IDEA的Web项目右键无法创建Servlet问题

右键新建没有servlet? 在pom.xml文件中需要导入servlet依赖&#xff0c;很简单的&#xff0c;别担心&#xff0c;就20秒解决 看我操作&#xff01;&#xff01;&#xff01; 1. 找到自动生成的pom.xml文件 只要你创建了maven项目&#xff0c;就会自动生成pom.xml文件&#xf…

基于Java废物回收机构管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

python多继承的3C算法

python多继承的3C算法 有很多地方都说python多继承的继承顺序&#xff0c;是按照深度遍历的方式&#xff0c;其实python多继承顺序的算法&#xff0c;不是严格意义上的深度遍历&#xff0c;而是基于深度遍历基础上优化出一种叫3C算法 python多继承的深度遍历 class C:def ru…

Solidworke学习(齿轮绘画)

目录 一、齿轮的基础理论 二、齿轮啮合传动的条件 三、传送比 四、绘画齿轮的步骤 五、绘画齿数小的齿轮 学习链接&#xff1a;徒手画齿轮配合&#xff0c;solidworks超简单3D打印齿轮画法_哔哩哔哩_bilibili 一、齿轮的基础理论 齿轮的啮合通过渐开线之间的互相挤压实现…

【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

VRay是什么?有什么特点?渲染100邀请码1a12

Vray是由Chaos Group开发的高性能渲染引擎&#xff0c;能为不同的三维建模软件提供图像和动画渲染服务&#xff0c;它有以下几个特点。 1、Vray采用了先进的光线追踪技术&#xff0c;能够模拟真实世界中光线的传播和反射&#xff0c;生成的图像和动画十分逼真。 2、Vray提供了…

【C++】 ——【模板初阶】——基础详解

目录 1. 泛型编程 1.1 泛型编程的概念 1.2 泛型编程的历史与发展 1.3 泛型编程的优势 1.4 泛型编程的挑战 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 函数模板的特化 2.7 函数模板的使…

目前常见的几款企业级im即时通讯软件有哪些?

在目前的市场上&#xff0c;有几款常见的企业级即时通讯软件广受企业青睐。以下是其中几款主流企业级即时通讯软件的介绍和特点。 1. 微软Teams 微软Teams是一款集即时通讯、协作和视频会议功能于一体的企业级通讯软件。它提供了实时聊天、语音通话、视频会议、文件共享和团队…

账号和权限的管理1

文章目录 修改用户账号的属性usermod格式常用选项 用户账号的初始化配置文件文件来源主要的用户初始配置文件 组账号文件添加组账号groupadd格式常用选项其他选项 删除组账号groupdel格式 查询账号信息groups格式 id格式 finger格式 W、who、users格式 文件/目录的权限和归属访…

整车功能开发

整车功能开发 站在前人的肩膀上&#xff0c;从系统功能架构集成角度梳理下整车功能开发相关内容 1、整车功能开发相关文件介绍 1.1 配置表 上面的表格&#xff0c;是一种车辆特性的表达方式&#xff0c;其实比较传统&#xff0c;我们称之为配置表&#xff08;Feature list&a…

Python使用defaultdict简化值为list的字典

原始代码&#xff1a; from typing import Dictrelated_objects_for_fetch: Dict[str, list] {}for key, value in [(k1, v1), (k1, v2), (k2, v2), (k3, v3), (k2, v2)]:if key not in related_objects_for_fetch:related_objects_for_fetch[key] []if value not in (value…