数据库系统之查询处理与优化

查询处理的过程
在这里插入图片描述
第一步
就是语法分析器与翻译器处理,对SQL查询语句进行语法验证,保证查询语句的正确性,然后将SQL查询语句翻译为可使用的形式
第二步
是将SQL查询语句翻译为系统对应的内部表示形式,即关系代数表达式
第三步
就是对关系代数表达式进行优化,找出最优的效率最高的关系代数表达式
第四步
根据这个关系代数表达式制定好执行计划(执行计划是指执行一个查询的计算机原语,也就是说它是标注了如何执行一个或多个关系代数操作的操作序列)
第五步
执行引擎按照执行计划进行执行,对数据库中的表,函数进行操作,最终得到查询结果响应给用户。

优化器(就是对关系代数的优化,是通过等价变换得到优化执行方案,也就是操作执行的顺序,包含了注释是否需要采用索引,具体采用的操作执行算法等)

查询代价的度量
1.查询处理的代价可通过该查询对各种资源的使用情况进行度量
2.然而在大型数据库系统中,在磁盘存取数据的代价通常是最主要的代价
3.我们可以使用传送磁盘块数以及搜索磁盘次数来度量查询计划代价。假设磁盘子系统传送一个块的数据平均消耗tr秒,磁盘块平均访问时间(磁盘搜索时间加上旋转延迟)为ts秒,那么依次传送b个块以及执行S次磁盘搜索的操作消耗btr+Sts秒

SQL中常见的查询
1.整个表数据全部读取,也就是没有任何条件的查询
2.有一个单一条件准确定位某一个数据记录
3.有一个范围条件要定位多个数据记录
4.单个条件和范围条件的结合

选择操作典型实现方法
1.简单的全表扫描方法
顺序扫描,输出满足条件的元组,适合小表,不适合大表
2.索引(或散列)扫描方法
通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组。适合选择条件中的属性上有索引(例如B+树索引或Hash索引)

选择操作的实现
例:select * from Student,SC where Student.sno=SC.sno
1.嵌套循环方法
对外层循环(Student)的每一个元组(s),检索内层循环(SC)中的每一个元组(sc),检查这两个元组在连接属性(sno)上是否相等,如果满足连接条件,则串接后作为结果输出,知道外层循环表中的元组处理完为止。
2.排序-合并方法(适合连接的诸表已经排好序的情况)
如果连接的表没有排好序,先对Student表和SC表按连接属性sno排序,取Student表中第一个sno,依次扫描SC表中具有相同sno的元组,当扫描到sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同sno的元组,把它们连接起来重复上述步骤直到Student表扫描完。
3.索引连接方法
在SC表上建立属性sno的索引,(如果原来没有索引),对Student表中每一个元组,由sno值通过SC的索引查找相应的SC元组,把这些SC元组和Student表中的元组处理完为止。
4.Hash Join方法
把连接属性作为hash码,用同一个hash函数把R和S中的元组散列到同一个hash文件中。

查询的代价主要考虑的内容
在分布式数据库系统中,查询代价除了考虑CPU代价I/O代价外,由于数据分布在不同的场地上,使得查询处理中还要考虑站点间传输数据的代价;分布透明性是指用户不需要了解数据分片的位置,分片的分配位置以及数据复制的过程;分布式查询优化一般需要考虑操作的执行顺序和数据在不同场地间的传输顺序;执行分布式数据库查询时,导致数据传输量大的主要原因时数据间的连接操作和并操作

查询优化
同一个SQL查询语句的不同关系代数表达式,它查询代价时不同的,可以根据关系代数表达式的等价转换,将关系代数表达式变成代价较低的关系代价表达式,来实现查询优化。

查询树和查询执行计划之间的区别
查询树不是最优的,不包含实际执行时选择的算法,执行计划=优化后的查询树+选择的实际执行的算法(连接运算是用块连接还是散列连接,是否用流水线等);
查询执行的时候是用的执行计划,即优化后的查询树加上相应操作的具体算法;
查询树的基本优化策略
选择下移优化策略(优先做选择,后做关系连接,将选择移到靠近关系)
投影下移优化策略(通过等价规则先进行投影,去除对查询无意义的属性,再做连接)
选择连接顺序优化策略(小关系的连接优先,这样做中间结果元组会很少,这个代价也会很低)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章