SQL的三维概况SQL起源于1970年代的IBMR系统,是关系型数据库的声明式查询语言。一句话引出三点:1.Relational(关系型):一种基于关系代数理论的数据建模方法,其他建模方法如文档数据库、图数据库等。以SQL表的方式理解,任何数据集都可以抽象成一个二维表,每一行有一个元组(tuple),每个元组有多个属性列;将对数据集的查询抽象为一组算子的组合,即二维表的一组变换。常用运算符:关系表的变换选择(σ):对于单个二维表,选择其中的部分行;对应SQL中的where子句投影(π):对于单个二维表,选择其中的部分列;对应SQL中的selectxx子句naturaljoin(?):对于两个二维表,按照某一列的等价值进行合并;对应SQL2中的join子句。声明式:与命令式相反,可以类比为编程接口。专注于描述而不是实现。举个例子感受一下:声明式:“查找今天教三的空闲教室”命令:“1.找出所有教三的教室2.查看每个教室的排班表,看是否空闲3.如果是free,addtheresultSet”3.查询语言(Query):顾名思义,这是一种专门用来查询满足条件的数据的语言,比如“找教室”。虽然它是图灵完备的,但一般不会像一般的编程语言C++那样用来编写复杂的软件。SQL执行过程CMU15445课程地图SQL也是一种语言,所以它的执行过程类似于前端的编译器。参考上图(来自cmu15-445),大致可以分为几个步骤:解析:将适合人类阅读的文本转换成SQL语句,并进行基本的语法检查。然后基于关系代数,构造一个抽象语法树(AST,AbstractSyntaxTree)。叶子节点是表,中间节点是运算符。验证:检查插入的数据格式是否满足先前定义的模式。例如,如果学生表定义了三列:学号、姓名和课程,则每一行插入数据的属性不能超过三个。Planning:使用schema信息将语法树中的元素(各种有意义的名称)转化为内部表示(各种无意义且不重复的id),生成逻辑计划。优化:逻辑计划由多个数据转换操作组成。基于关系代数中运算符的一些性质(如交换性和结合性),我们可以调整变换的顺序和组合,使得查询消耗的资源(包括计算、存储和网络带宽等)最终生成一个物理执行计划,通常包括基于规则和基于成本的方法。Execution:执行优化后的执行计划(一般还是树形)。包括从外部存储中取数据到内存中,对内存中的数据进行各种转换。不管数据在外存中是什么形式,从内存中取出后都可以理解为上面说的二维表,然后按照树形结构应用各种算子进行计算。有时验证阶段也归入分析范畴,有时将执行阶段的表达式求值单挑出来,但总体职责就这几个,排列顺序也基本确定,只是划分可能不同。之后,每个阶段都会发表一篇短文。参考https://15445.courses.cs.cmu.edu/fall2022/notes/02-modernsql.pdfhttps://15445.courses.cs.cmu.edu/fall2022/notes/14-optimization.pdf数据库系统概念,章节第15章查询处理和第16章查询优化
