⾼级数据库四:浅谈数据库查询过程(QueryProcessing)
我们知道,⽬前通⽤的数据库查询语⾔是SQL语⾔(Structured Query Language)。SQL语⾔也是⼀种编译型语⾔,需要SQL编译器编译后才能执⾏,但它与C、C++、Java等语⾔不同,SQL语⾔是⼀种⾮过程化语⾔,这意味着使⽤SQL进⾏操作的时候,你只需要指定你要达到什么⽬的,⽽⽆需指明要怎样达到⽬的。
既然⽤户只需要解决“做什么”的问题,那么,“怎么做”的问题正是本⽂要讨论的问题。
优化器(Optimizer)
优化器也称查询优化器(Query Optimizer),它的主要⼯作是优化数据访问,根据提交的SQL语句,综合各种已有的信息(主要是系统编⽬表)来产⽣最优的可执⾏的访问⽅案。
优化器在整个数据库系统中占据着⾄⾼⽆上的地位,它是数据库性能的决定因素,是所有数据库引擎中最重要的组件。
优化器的⼯作可以直观的理解为以下4个步骤:
1. 接收并验证SQL语句的语法语义;
2. 分析环境并优化满⾜SQL语句的⽅法;
3. 创建计算机可读指令来执⾏优化的SQL;
4. 执⾏指令或存储他们以便将来执⾏。
查询过程
先来看看SQL语句的⼤致执⾏流程
语法分析(Parse Query)
SQL语句被提交给SQL编译器,编译器通过语法树(Parse Tree)分析该语句,检查其语法,如果存在语法错误,编译器就停⽌处理并返回错误信息;如果不存在语法问题,编译器会将SQL语句转换为可被优化器分析的逻辑查询语句(关系代数语句),并据此创建该查询的查询图模。
语义检查(Check Semantics)
语法分析完成后,编译器会根据查询图模型进⾏语义检查(⽐如检查语句中的数据类型是否与数据库的表列的数据类型⼀致),语义检查完成后也会将相关信息添加到查询图模型,包括参考约束,表检查约束,触发器,和视图信息等。
数据库优化sql语句查询重写(Rewrite Query)
如果SQL语句的语法语义都没有问题,就可以正式进⾏查询操作了。这是优化器进⾏查询优化的开始阶段,其⽬的是将提交的SQL语句优化成效率更⾼的形式。
这种优化可以是基于查询成本的考虑,也可以是基于查询规则的考虑,是基于关系代数语句进⾏的调整。举⼀个直观的例⼦:
考虑下⾯两条SQL语句,查询⼯龄为5年的员⼯及其所享有的年终奖级别:
Select EMPLOYEE.Name, WELFARE.Bonus From EMPLOYEE, WELFARE Where EMPLOYEE.Seniority > 5And  EMPLOYEE.Seniority = WELFARE.Senio Select EMPLOYEE.Name, WELFARE.Bonus From EMPLOYEE, WELFARE Where EMPLOYEE.Seniority > 5And  WELFARE.Seniority > 5And  EMPLOYEE 很显然,两条语句的功能相同,第⼆条后⾯的“WELFARE.Seniority > 5”条件还有点多余,那么,那条语句的执⾏效率更⾼?
答案是第⼆条!因为第⼀条将EMPLOYEE中Seniority>5的⾏与WELFARE中的所有⾏作外连接再来Seniority相等的⾏,⽽第⼆条则是
将EMPLOYEE中Seniority>5的⾏和WELFARE中Seniority>5的⾏作外连接再来Seniority相等的⾏。显然,第⼆条语句只有更少的⾏参
与外连接,效率⾃然更⾼。
可是,我们通常写出的查询语句都是第⼀条的形式,⽽查询重写却可以将之优化,优化器的查询重写器能⾃动帮我们完成查询语句的优化,
到更⾼效的查询形式。
当然了,查询重写并不是直接对SQL语句作上述例⼦那样的优化,它操作的是由语法分析转换过的关
系代数语句,且需要根据重写图模型提
供的信息作出形式优化。
优化访问计划(Optimizer Access Plan)
根据查询图模型提供的信息,优化器会⽣成许多能够满⾜查询请求的访问计划(执⾏⽅案⽅案),然后优化器综合系统编⽬表中关于表,索
引,列和函数等等的统计信息,估计每种访问计划的执⾏成本,并选择具有最⼩成本的⽅案作为最终的访问计划(Acess Plan)。
⽣成可执⾏代码(Generate Executable Code)
根据最终选定的访问计划⽣成执⾏代码,类似C语⾔编译后⽣成可被机器识别的机器码⼀样。
执⾏访问计划(Execute Plan)
执⾏可执⾏代码,获取查询结果集。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。