6-1数据库查询处理与优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22841811/article/details/51789568

6-1数据库查询处理与优化

tags:数据库

关系数据库的查询处理

查询处理是关系数据库管理系统执行查询语句的过程,其任务是把用户提交给关系数据库管理系统的查询语句转换为高效的查询执行计划

相关名词解释

SQL词法分析和语法分析

词法分析是将语句中的单词流识别出来,比如create table Student 词法分析是分析出 这句的单词流是 “create” “table” “identifier”(前提是你给它们编号 比如用宏或者枚举),然后语法分析 是通过单词流 判断 非逻辑错误 比如 有不能识别的符号 create table后面不是标示符等等 语义分析是分析语句的逻辑关系 比如字段长度越界什么的如 vchar(2)你赋值为“啊啊啊啊啊啊”这种错误的识别是语义分析阶段完成的

SQL语义检查

根据数据字典中有关的模式定义检查语句中的数据对象,如关系名,属性名是否存在和有效.如果是对视图的操作,则要用视图消解的方法把对视图的操作转换为对基本表的操作,还要根据数据字典中的用户权限和完整性约束对用户的存取权限进行检查.注意此时的检查是初步的,静态的检查!

查询处理步骤

查询处理可以分为四个阶段:查询分析,查询检查,查询优化,查询执行

  1. 查询分析,首先对查询语句进行扫描,词法分析和语法分析.

  2. 查询检查,对合法的查询语句进行语义检查,检查通过后便把SQL查询语句转换成内部表示,即等价的关系代数表达式

  3. 查询优化,每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略.

  4. 查询执行,根据查询优化器得到的执行策略生成查询执行计划,由代码生成器执行这个查询计划的代码,然后加以执行,送回查询结果.

查询处理流程图

Created with Raphaël 2.1.0开始查询查询语句查询分析:词法分析语法分析查询树 查询优化:物理优化代数优化查询执行计划代码生成查询计划的执行代码查询结束

一个查询操作算法示例

选择操作的实现

    select * from student where <条件表达式>
  1. 全表扫描算法,按照物理次序读Student的M块到内存,检查内存的每个元组t,如果t满足选择条件,则输出t,如果Student还有其他块未被处理,重复上述步骤.

  2. 索引扫描算法,如果选择条件中的属性上有索引,则可以用索引扫描方法通过索引先找到满足条件的元组指针,再通过元组指针在查询的基本表中找到元组.

一般情况下,当选择率较低时,基于索引的选择算法要优于全表扫描算法,但是在某些情况下,例如选择率较高,或者要查找原则均匀分布在查找的表中,这时基于索引的选择算法性能不如全表扫描算法.

连接操作实现

select * from student,sc 
where student.sno = sc.sno
  1. 循环嵌套算法,对外层循环student表的每一个元组,检索内层循环sc表中的每一个元组.满足条件则输出.

  2. 排序-合并算法,是等值连接的常用算法,尤其适合参与连接的诸个表已经排好序的情况.

  3. 索引连接算法,在sc表上已经建立了属性sno
    的索引,对student中每一个元组,由sno值通过sc的索引找到对应的sc元组,再把sc和student元组连接起来.

  4. hash join算法,hash join算法把连接属性作为hash码,用同一个哈希函数把student表和sc表同时散列到哈希表中.分为两个阶段,第一阶段,为划分阶段,对包含元组较少的表进行一遍处理,把它的元组按照hash函数散列到hash桶中,第二部为试探阶段,即连接阶段,对另一个表进行一遍处理,元组较多的表按照同一个hash函数进行散列,找到适当的hash桶.

查询优化

查询优化比用户程序优化好的原因

  1. 优化器可以从数据字典中获取许多统计信息,例如关系中的元组数,关系中每个属性值的分布情况,索引等.优化器可以根据这些信息做出估算,选择更加高效的查询计划.

  2. 如果数据库的物理统计信息改变了,系统可以自动对查询进行重新优化以选择相适应的执行计划.

  3. 优化器可以考虑数百种不同查询计划,而程序员一般只能考虑几种.

  4. 优化器中包括了很多复杂的优化技术,这些技术往往只有最好的程序员才能掌握,系统的自动优化相当于使得所有人都拥有这些优化技术.

查询优化的总目标是选择最有效的策略,求的给定关系表达式的值,使得查询代价最小,因为查询优化的搜索空间有时非常大,实际系统选择的策略不一定是最优的,而是较优的.

代数优化

SQL语句经过查询分析,查询检查后变化为查询树,它是关系代数表达式的内部表示.

关系代数等价变换

代数优化策略就是通过对关系代数表达式的等价变换来提高查询效率的.

查询树的启发式优化

典型的启发式规则有:
1. 选择运算尽可能先做.减少中间结果大小.
2. 把投影运算的选择运算同时进行,如果有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有这些运算以避免重复扫描.
3. 把投影同其前或者其后的双目运算结合起来,没有必要为了去掉某些字段而才重新扫描一遍关系.
4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接运算要笔同样关系上的笛卡尔积接生很多时间.
5. 找出公共子表达式.

物理优化

物理优化就是要选择高效合理的操作算法或存取路径,求的优化的查询计划,达到查询优化的目标.

选择的方法

  1. 基于规则的启发式优化.
  2. 基于代价估算的优化.
  3. 量着结合的优化方法.

基于启发式规则的存取路径优化

选择操作的启发式规则
  1. 对于选择条件是”主码=值”的查询,查询结果最多是一个元组,可以选择主码索引.
  2. 对于选择条件是”非主属性=值”的查询,并且选择列上有索引,则要估算结果元组的数目,如果比较小<1/10可以使用索引扫描,否则全表扫描.
  3. 对于属性上的非等值查询或者范围查询,如果选择列上有索引,同样要估算数目,决定使用索引扫描还是全表扫描.
  4. 对于用and连接的合取选择条件,如果有组合索引则使用组合索引,如果某些属性上有一般索引,则可以使用索引扫描,否则使用全表扫描.
  5. 对于or条件,一般使用全表扫描.
连接操作启发式规则
  1. 如果两个表都已经按照连接属性排序,则选用排序-合并算法.
  2. 如果一个表在连接属性上有索引,则可以使用索引连接算法.
  3. 如果上面两个都不适用可以使用hash join算法
  4. 使用循环嵌套算法.

基于代价估算的优化

数据字典中存储了优化器需要的统计信息,主要包括以下三个方面:
1. 对于每个基本表,该表的元组总数,元组长度,占的块数,占用的溢出块数;
2. 对于基本表的每个列,该列不同值的个数,该列最大值,最小值,该列上是否有索引,何种索引.
3. 对于索引,例如B+树索引,该索引的层数,不同索引值的个数,索引的选择基数,索引的叶节点数.

展开阅读全文

没有更多推荐了,返回首页