第九章 关系查询处理和查询优化——关系数据库系统的查询处理
Posted 凯哥的故事
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章 关系查询处理和查询优化——关系数据库系统的查询处理相关的知识,希望对你有一定的参考价值。
本章介绍关系数据库的查询处理(query processing)和查询优化(query optimization)技术。首先介绍关系数据库管理系统的查询处理步骤,然后介绍查询优化技术。查询优化一般可分为代数优化(也称为逻辑优化)和物理优化(也称为非代数优化)。代数优化是指关系代数表达式的优化,物理优化则是指通过存取路径和底层操作算法的选择进行的优化。
本章讲解实现查询操作的主要算法思想,目的是使读者初步了解关系数据库管理系统查询处理的基本步骤,及查询优化的概念、基本方法和技术,为数据库应用开发中利用查询优化技术提高查询效率和系统性能打下基础。
关系数据库系统
的查询处理
查询处理是关系数据库管理系统执行查询语句的过程,其任务是把用户提交给关系数据库管理系统的查询语句转换为高效的查询执行计划。
查询处理步骤
关系数据库管理系统查询处理可以分为4个阶段:查询分析、查询检查、查询优化和查询执行,如下图所示。
①查询分析
首先对查询语句进行扫描、词法分析和语法分析。从查询语句中识别出语言符号,如SQL关键字、属性名和关系名等,进行语法检查和语法分析,即判断查询语句是否符合SQL语法规则。如果没有语法错误就转入下步处理,否则便报告语句中出现的语法错误。
②查询检查
对合法的查询语句进行语义检查,即根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名、属性名是否存在和有效。如果是对视图的操作,则要用视图消解方法把对视图的操作转换成对基本表的操作。还要根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。如果该用户没有相应的访问权限或违反了完整性约束,就拒绝执行该查询。当然,这时的完整性检查是初步的、静态的检查。检查通过后便把SQL查询语句转换成内部表示,即等价的关系代数表达式。这个过程中要把数据库对象的外部名称转换为内部表示。关系数据库管理系统一般都用查询树(query tree),也称为语法分析树(syntax tree)来表示扩展的关系代数表达式。
③查询优化
每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略。查询优化有多种方法。按照优化的层次一般可将查询优化分为代数优化和物理优化。代数优化是指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效:物理优化则是指存取路径和底层操作算法的选择。选择的依据可以是基于规则(rule based)的,也可以是基于代价(cost based)的,还可以是基于语义(semantic based)的。
实际关系数据库管理系统中的查询优化器都综合运用了这些优化技术,以获得最好的查询优化效果。
④查询执行
依据优化器得到的执行策略生成查询执行计划,由代码生成器(codegenerator)生成执行这个查询计划的代码,然后加以执行,回送查询结果。
实现查询操作的算法示例
本节简单介绍选择操作和连接操作的实现算法,确切地说是算法思想。每一种操作有多种执行的算法,这里仅仅介绍最主要的几个算法,对于其他重要操作的详细实现算法,有兴趣的读者请参考有关关系数据库管理系统实现技术的书。
①选择操作的实现
第3章中已经介绍了SELECT语句的强大功能,SELECT语句有许多选项,因此实现的算法和优化策略也很复杂。不失一般性,下面以简单的选择操作为例介绍典型的实现方法。
【例1】SELECT * FROM Student WHERE <条件表达式>;
考虑<条件表达式>的几种情况:
C1:无条件;
C2: Sno='201215121';
C3: Sage>20;
C4:Sdept='CS' AND Sage>20;
选择操作只涉及一个关系,一般采用全表扫描或者基于索引的算法。
(1)简单的全表扫描算法(table scan)
假设可以使用的内存为M块,全表扫描的算法思想如下:
①按照物理次序读Student的M块到内存。
②检查内存的每个元组t,如果t满足选择条件,则输出t。
③如果Student还有其他块未被处理,重复①和②。
全表扫描算法只需要很少的内存(最少为1块)就可以运行,而且控制简单。对于规模小的表,这种算法简单有效。对于规模大的表进行顺序扫描,当选择率(即满足条件的元组数占全表的比例)较低时,这个算法效率很低。
(2)索引扫描算法(index scan)
如果选择条件中的属性上有索引(例如B+树索引或hash索引),可以用索引扫描方法,通过索引先找到满足条件的元组指针,再通过元组指针在查询的基本表中找到元组。
以C2为例:Sno='201215121',并且Sno上有索引,则可以使用索引得到Sno为'201215121'元组的指针,然后通过元组指针在Student表中检索到该学生。
以C3为例:Sage>20,并且Sage上有B+树索引,则可以使用B+树索引找到Sage=20的索引项,以此为入口点在B+树的顺序集上得到Sage>20的所有元组指针,然后通过这些元组指针到Student表中检索到所有年龄大于20的学生。
以C4 为例:Sdept='CS' AND Sage>20,如果Sdept和Sage上都有索引,一种算法是,分别用上面两种方法找到Sdept='CS'的一组元组指针和Sage>20的另一组元组指针,求这两组指针的交集,再到Student表中检索,就得到计算机系年龄大于20岁的学生。
另一种算法是,找到Sdept='CS'的一组元组指针,通过这些元组指针到Student表中检索,并对得到的元组检查另一些选择条件(如Sage>20)是否满足,把满足条件的元组作为结果输出。
一般情况下,当选择率较低时,基于索引的选择算法要优于全表扫描算法。但在某些情况下,例如选择率较高,或者要查找的元组均匀地分布在查找的表中,这时基于索引的选择算法的性能不如全表扫描算法。因为除了对表的扫描操作,还要加上对B+树索引的扫描操作,对每一个检索码,从B+树根结点到叶子结点路径上的每个结点都要执行一次I/O操作。
②连接操作的实现
连接操作是查询处理中最常用也是最耗时的操作之一。人们对它进行了深入的研究,提出了一系列的算法。不失一般性,这里通过例子简单介绍等值连接(或自然连接)最常用的几种算法思想。
【例2】SELECT * FROM Student, SC WHERE Student.Sno=SC.Sno;
(1)嵌套循环算法(nested loop join)
这是最简单可行的算法。对外层循环(Student表)的每一个元组,检索内层循环(SC表)中的每一个元组,并检查这两个元组在连接属性(Sno)上是否相等。如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止。这里讲的是算法思想,在实际实现中数据存取是按照数据块读入内存,而不是按照元组进行I/O的。嵌套循环算法是最简单最通用的连接算法,可以处理包括非等值连接在内的各种连接操作。
(2)排序-合并算法(sort-merge join或merge join)
这是等值连接常用的算法,尤其适合参与连接的诸表已经排好序的情况。
用排序-合并连接算法的步骤是:
①如果参与连接的表没有排好序,首先对Student表和SC表按连接属性Sno排序。
②取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组,把它们连接起来(如下图所示)。
③当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来。
重复上述步骤直到 Student表扫描完。
这样Student表和SC表都只要扫描一遍即可。当然,如果两个表原来无序,执行时间要加上对两个表的排序时间。一般来说,对于大表,先排序后使用排序-合并连接算法执行连接,总的时间一般仍会减少。
(3)索引连接(index join)算法
用索引连接算法的步骤是:
①在SC表上已经建立了属性Sno的索引。
②对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组。
③把这些SC元组和Student元组连接起来。
循环执行②③,直到Student表中的元组处理完为止。
(4)hash join算法
hash join算法也是处理等值连接的算法。它把连接属性作为hash码,用同一个hash函数把Student表和SC表中的元组散列到hash表中。第一步,划分阶段(building phase),也称为创建阶段,即创建hash表。对包含较少元组的表(如Student表)进行一遍处理,把它的元组按hash函数(hash码是连接属性)分散到hash表的桶中;第二步,试探阶段(probing phase),也称为连接阶段(join phase),对另一个表(SC表)进行一遍处理,把SC表的元组也按同一个hash函数(hash 码是连接属性)进行散列,找到适当的hash桶,并把SC元组与桶中来自Student表并与之相匹配的元组连接起来。
上面的hash join算法假设两个表中较小的表在第一阶段后可以完全放入内存的hash桶中。以上的算法思想可以推广到更加一般的多个表的连接算法上。
以上是关于第九章 关系查询处理和查询优化——关系数据库系统的查询处理的主要内容,如果未能解决你的问题,请参考以下文章
通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账