精华内容
下载资源
问答
  • 关系数据库查询处理

    千次阅读 2018-07-12 12:47:05
    查询优化分为:代数优化(逻辑优化)和物理优化(非代数优化)。 1. 代数优化:关系代数表达式的优化 ...一、查询处理步骤 1. 查询分析 对查询语句进行扫描、词法分析和语法分析。从查询语句中识...

    查询优化分为:代数优化(逻辑优化)和物理优化(非代数优化)。
    1. 代数优化:关系代数表达式的优化
    2. 物理优化:通过存取路径和底层操作算法的选择进行的优化。

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

    一、查询处理步骤

    1. 查询分析

    对查询语句进行扫描、词法分析和语法分析。从查询语句中识别出语言符号,进行语法检查和语法分析,即判断查询语句是否符合SQL语法规则,如果没有语法错误就转入下步处理,否则便报告语句中出现的语法错误。

    2. 查询检查

    对合法的查询语句进行语义查询,即根据数据字典中有关的模式定义检查语句中的数据库对象(关系名、属性名)是否存在和有效。如果是对视图的操作,要用视图消解方法把对视图的操作转换成对基本表的操作。还要根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。如果对该用户没有相应的防伪权限或违反了完整性约束,就拒绝执行该查询。当然,这时的完整性检查是初步、静态的检查。检查通过后便把SQL查询语句转换成内部表示,即等价的关系代数表达式。这个过程中要把数据库对象的外部名称转换为内部表示。关系数据库管理系统一般都用查询树,也称为语法分析树来表示扩展的关系代数表达式。
    查询处理步骤图示:
    查询处理步骤

    3. 查询优化

    每个查询都会有许多可供选择的执行策略和操作算法,查询优化就是选择一个高效执行的查询处理策略。
    按照优化的层次:
    1. 代数优化
    指关系代数表达式的优化。按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效。
    2. 物理优化
    指存取路径和底层操作算法的选择。选择的依据可以是基于规则的,也可以是基于代价的,还可以是基于语义的。

    4. 查询执行

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

    二、实现查询操作的算法

    1. 选择操作的实现

    select * from table where <条件表达式 >
    选择操作只涉及一个关系,一般采用全表扫描或者基于索引的算法。
    1. 简单的全表扫描算法
    假设可以使用的内存为M块,则:
    a. 按照物理次序读Table的M块到内存。
    b. 检查内存的每个元组t,如果t满足条件,则输出t。
    c. 如果table还有其他块未处理,重复a 和 b。
    全表扫描算法只需要很少的内存就可以运行,而且控制简单。
    2. 索引扫描算法
    如果选择条件中的属性上有索引(B+树或hash索引),通过索引先找到满足条件的元组指针,再通过元组指针在查询的基本表中找到元组。

    当选择效率较低时,基于索引的选择算法要优于全表扫描算法。但选择率较高或者要查找的元组均分在查找表中,全表扫描法的性能就会比较高。

    2. 连接操作的实现

    连接操作是查询处理中最常用也是最耗时的操作之一。
    select * from table1,table2 where table1.id = table2.tid
    1. 嵌套循环(nested loop join)算法
    对外层循环(table1)的每一个元组,检索内层循环中(table2)的每一个元组,并检查两个元组在连接属性上是否相等。如果连接条件满足,则串接后作为结果输出,直到外层循环表中的元组处理完为止。
    2. 排序-合并(sort-merge join)算法
    这是等值连接常用的算法,尤其适合参与连接的诸表已经排好序的情况。
    1) 如果参与连接的表没有排好序,首先对table1和table2按连接属性id和tid进行排序。
    2)取table1中的第一个id,依次扫描table2中具有相同tid的元组,把它们连接起来。
    3)当扫描到id不相同的第一个table2元组时,返回table1表扫描它的下一个元组,再扫描table2表中具有相同id的元组进行连接。
    3. 索引连接(index join)算法
    1)在table2上已经建立了属性tid的索引。
    2)对table1中每一个元组,由id值通过table2的索引查找相应的table2元组。
    3)把这些table12元组和table1表中的元组连接起来。
    循环执行2)和3),直到table1中的元组处理完为止。
    4. hash join算法
    它把连接属性作为hash码,用同一个hash函数把两张表中的元组散列到hash表中。
    1)划分阶段(创建阶段)
    创建hash表,对包含较少元组的表进行一遍处理,把它的元组按hash函数(hash码是连接属性)分散到hash表中的桶中。
    2)试探阶段(连接阶段)
    对另一个表进行一遍处理,把table2表的元组也按同一个hash进行散列,找到适当的hash桶,并把table2元组与桶中来自table1并与之相匹配的元组连接起来、

    展开全文
  • RDBMS的查询处理步骤 查询优化的概念 基本方法和技术 查询优化分类 : 代数优化 物理优化RDBMS查询处理阶段 : 1. 查询分析 2. 查询检查 3. 查询优化 4. 查询执行 对查询语句进行扫描、词法分析和语法分析 从...

    关系系统

    本章目的:
    RDBMS的查询处理步骤
    查询优化的概念
    基本方法和技术

    查询优化分类 :
    代数优化
    物理优化

    RDBMS查询处理阶段 :

    1. 查询分析
    2. 查询检查
    3. 查询优化 
    4. 查询执行   

    对查询语句进行扫描、词法分析和语法分析
    从查询语句中识别出语言符号
    进行语法检查和语法分析

    查询检查

    根据数据字典对合法的查询语句进行语义检查
    根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查
    检查通过后把SQL查询语句转换成等价的关系代数表达式
    RDBMS一般都用查询树(语法分析树)来表示扩展的关系代数表达式
    把数据库对象的外部名称转换为内部表示

    查询优化

    查询优化:选择一个高效执行的查询处理策略
    查询优化分类 :
    代数优化:指关系代数表达式的优化
    物理优化:指存取路径和底层操作算法的选择
    查询优化方法选择的依据:
    基于规则(rule based)
    基于代价(cost based)

    查询执行

    依据优化器得到的执行策略生成查询计划
    代码生成器(code generator)生成执行查询计划的代码

    选择操作的实现

    [例1]Select * from student where <条件表达式> ;
        考虑<条件表达式>的几种情况:
        C1:无条件;
         C2:Sno='200215121';
         C3:Sage>20;
         C4:Sdept='CS' AND Sage>20

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

    [例1-C2]  以C2为例,Sno=‘200215121’,并且Sno上有索引(或Sno是散列码)
    使用索引(或散列)得到Sno为‘200215121’ 元组的指针
    通过元组指针在student表中检索到该学生
    
    [例1-C3]  以C3为例,Sage>20,并且Sage 上有B+树索引
    使用B+树索引找到Sage=20的索引项,以此为入口点在B+树的顺序集上得到Sage>20的所有元组指针
    通过这些元组指针到student表中检索到所有年龄大于20的学生。 
    
    [例1-C4]  以C4为例,Sdept=‘CS’ AND Sage>20,如果Sdept和Sage上都有索引:
    算法一:分别用上面两种方法分别找到Sdept=‘CS’的一组元组指针和Sage>20的另一组元组指针
    求这2组指针的交集
    到student表中检索
    得到计算机系年龄大于20的学生
    
    算法二:找到Sdept=‘CS’的一组元组指针,
    通过这些元组指针到student表中检索
    对得到的元组检查另一些选择条件(如Sage>20)是否满足
    把满足条件的元组作为结果输出。  
    

    连接操作的实现

    连接操作是查询处理中最耗时的操作之一
    本节只讨论等值连接(或自然连接)最常用的实现算法

    [例2]   SELECT * FROM Student,SC               
                        WHERE Student.Sno=SC.Sno;

    嵌套循环方法(nested loop)

    对外层循环(Student)的每一个元组(s),检索内层循环(SC)中的每一个元组(sc)
    检查这两个元组在连接属性(sno)上是否相等
    如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止

    排序-合并方法(sort-merge join 或merge join)

    适合连接的诸表已经排好序的情况
    排序-合并连接方法的步骤:
    如果连接的表没有排好序,先对Student表和SC表按连接属性Sno排序
    取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组

    索引连接(index join)方法

    步骤:
    ① 在SC表上建立属性Sno的索引,如果原来没有该索引
    ② 对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组
    ③ 把这些SC元组和Student元组连接起来
    循环执行②③,直到Student表中的元组处理完为止

    Hash Join方法

    把连接属性作为hash码,用同一个hash函数把R和S中的元组散列到同一个hash文件中
    步骤:
    划分阶段(partitioning phase):
    对包含较少元组的表(比如R)进行一遍处理
    把它的元组按hash函数分散到hash表的桶中
    试探阶段(probing phase):也称为连接阶段(join phase)
    对另一个表(S)进行一遍处理
    把S的元组散列到适当的hash桶中
    把元组与桶中所有来自R并与之相匹配的元组连接起来

    排序-合并连接方法的步骤(续):
    当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来
    重复上述步骤直到Student 表扫描完
    Student表和SC表都只要扫描一遍
    如果2个表原来无序,执行时间要加上对两个表的排序时间
    对于2个大表,先排序后使用sort-merge join方法执行连接,总的时间一般仍会大大减少
    上面hash join算法前提:假设两个表中较小的表在第一阶段后可以完全放入内存的hash桶中

    展开全文
  • 1.查询处理步骤 关系数据库管理系统查询处理阶段 : 1)查询分析 :对查询语句进行扫描、词法分 析和语法分析 词法分析:从查询语句中识别出正确的语言符号 语法分析:进行语法检查 2)查询检查 查询检查的任务 ...

    数据库从入门到精通:戳我

    关系数据库系统的查询处理

    一、关系数据库系统的查询处理
    1.查询处理步骤
    关系数据库管理系统查询处理阶段 :
    1)查询分析 :对查询语句进行扫描、词法分 析和语法分析

    • 词法分析:从查询语句中识别出正确的语言符号
    • 语法分析:进行语法检查

    2)查询检查

    • 查询检查的任务
      合法权检查
      视图转换
      安全性检查
      完整性初步检查
    • 根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名、属性名是否存在和有效
    • 如果是对视图的操作,则要用视图消解方法把对视图的操作转换成对基本表的操作
    • 根据数据字典中的用户权限和完整性约束定义对 用户的存取权限进行检查
    • 检查通过后把SQL查询语句转换成内部表示,即等价的关系代数表达式
    • 关系数据库管理系统一般都用查询树,也称为语法分析树来表示扩展的关系代数表达式。

    3)查询优化:选择一个高效执行的查询处理策略
    查询优化分类:

    • 代数优化/逻辑优化:指关系代数表达式的优化
    • 物理优化:指存取路径和底层操作算法的选择

    查询优化的选择依据:

    • 基于规则(rule based)
    • 基于代价(cost based)
    • 基于语义(semantic based)

    4)查询执行

    • 依据优化器得到的执行策略生成查询执行计划
    • 代码生成器(code generator)生成执行查询计划 的代码
    • 两种执行方法:自顶向下;自底向上。

    2.实现查询操作的算法示例
    1)选择操作的实现
    全表扫描方法 (Table Scan)

    • 对查询的基本表顺序扫描,逐一检查每个元组是否满足 选择条件,把满足条件的元组作为结果输出。
    • 适合小表,不适合大表。

    索引扫描方法 (Index Scan)

    • 适合于选择条件中的属性上有索引(例如B+树索引或Hash索引)。
    • 通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组。

    2)连接操作的实现
    连接操作是查询处理中最耗时的操作之一。

    []
    SELECT * 
    FROM Student, SC 
    WHERE Student.Sno=SC.Sno;
    

    嵌套循环算法(nested loop join)

    • 对外层循环(Student表)的每一个元组(s),检索内层循 环(SC表)中的每一个元组(sc)
    • 检查这两个元组在连接属性(Sno)上是否相等
    • 如果满足连接条件,则串接后作为结果输出,直到外 层循环表中的元组处理完为止。

    排序-合并算法(sort-merge join 或merge join)

    • 如果连接的表没有排好序,先对Student表和SC表按 连接属性Sno排序
    • 取Student表中第一个Sno,依次扫描SC表中具有相 同Sno的元组
    • 当扫描到Sno不相同的第一个SC元组时,返回 Student表扫描它的下一个元组,再扫描SC表中具有 相同Sno的元组,把它们连接起来
    • 重复上述步骤直到Student 表扫描完

    注意:

    • Student表和SC表都只要扫描一遍
    • 如果两个表原来无序,执行时间要加上对两个表的排序时间
    • 对于大表,先排序后使用排序-合并连接算法执行连接,总的时间一般仍会减少

    索引连接(index join)算法

    • 在SC表上已经建立属性Sno的索引。
    • 对Student中每一个元组,由Sno值通过SC的索引查 找相应的SC元组。
    • 把这些SC元组和Student元组连接起来 循环执行前两步,直到Student表中的元组处理完为止

    Hash Join算法
    前提:假设两个表中较小的表 在第一阶段后可以完全放入内存的hash桶中。

    • 把连接属性作为hash码,用同一个hash函数把Student表和SC表 中的元组散列到hash表中。
    • 划分阶段(building phase, 也称为partitioning phase)
      对包含较少元组的表(如Student表)进行一遍处理
      把它的元组按hash函数分散到hash表的桶中
    • 试探阶段(probing phase,也称为连接阶段join phase)
      对另一个表(SC表)进行一遍处理
      把SC表的元组也按同一个hash函数(hash码是连接属性)进 行散列
      把SC元组与桶中来自Student表并与之相匹配的元组连接起来

    关系数据库系统的查询优化

    • 查询优化在关系数据库系统中有着非常重要的地位
    • 关系查询优化是影响关系数据库管理系统性能的关键因素
    • 由于关系表达式的语义级别很高,使关系系统可以从关系表达式中分析查询语义,提供了执行查询优化的可能性

    一、概述

    • 1.关系系统的查询优化
      是关系数据库管理系统实现的关键技术又是关系系统的优点所在。
      减轻了用户选择存取路径的负担。
    • 2.非关系系统
      用户使用过程化的语言表达查询要求,执行何种记录级的操作,以及操作的序列是由用户来决定的。
      用户必须了解存取路径,系统要提供用户选择存取路径的手段,查询效率由用户的存取策略决定。
      如果用户做了不当的选择,系统是无法对此加以改进的。

    3.查询优化的优点

    • 用户不必考虑如何最好地表达查询以获得较好的效率
    • 系统可以比用户程序的“优化”做得更好
      (1)优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息。
      (2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。
      (3)优化器可以考虑数百种不同的执行计划,程序员一 般只能考虑有限的几种可能性。
      (4)优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术

    4.关系数据库管理系统通过某种代价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案

    • 集中式数据库
      执行开销主要包括:磁盘存取块数(I/O代价);处理机时间(CPU代价);查询的内存开销
      I/O代价是最主要的
    • 分布式数据库
      总代价=I/O代价+CPU代价+内存代价+通信代价

    5.查询优化的总目标

    • 选择有效的策略
    • 求得给定关系表达式的值
    • 使得查询代价最小(实际上是较小)

    代数优化

    一、关系代数表达式等价变换规则

    • 代数优化策略:通过对关系代数表达式的等价变换来提高查询效率。
    • 关系代数表达式的等价:指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的。
    • 两个关系表达式E1和E2是等价的,可记为E1≡E。

    常用的等价变换规则:
    1.连接、笛卡尔积交换律
    设E1和E2是关系代数表达式,F是连接运算的条件,则有
    在这里插入图片描述
    2.连接、笛卡尔积的结合律
    设E1,E2,E3是关系代数表达式,F1和F2是连接运算的条件
    在这里插入图片描述
    3.投影的串接定律
    在这里插入图片描述

    • E是关系代数表达式
    • Ai(i=1,2,…,n),Bj(j=1,2,…,m)是属性名
    • {A1,A2,…,An}构成{B1,B2,…,Bm}的子集

    4.选择的串接定律
    在这里插入图片描述

    • E是关系代数表达式,F1、F2是选择条件
    • 选择的串接律说明选择条件可以合并,这样一次就可检查全部条件

    5.选择与投影操作的交换律
    在这里插入图片描述

    • 选择条件F只涉及属性A1,…,An。
    • 若F中有不属于A1,…,An的属性B1,…,Bm有更一般规则:
      在这里插入图片描述
      6. 选择与笛卡尔积的交换律
    • 如果F中涉及的属性都是E1中的属性,则
      在这里插入图片描述
    • 如果F=F1∧F2,并且F1只涉及E1中的属性,F2只涉及E2中的属性,则由上面的等价变换规则1,4,6可推出:
      在这里插入图片描述
    • 若F1只涉及E1中的属性,F2涉及E1和E2两者的属性,则仍有
      在这里插入图片描述
      它使部分选择在笛卡尔积前先做。

    7. 选择与并的分配律
    设E=E1∪E2,E1,E2有相同的属性名,则
    在这里插入图片描述
    8. 选择与差运算的分配律
    若E1与E2有相同的属性名,则
    在这里插入图片描述
    9. 选择对自然连接的分配律
    在这里插入图片描述
    F只涉及E1与E2的公共属性

    10. 投影与笛卡尔积的分配律
    设E1和E2是两个关系表达式,A1,…,An是E1的属性,B1,…,Bm是E2的属性,则
    在这里插入图片描述
    11. 投影与并的分配律
    设E1和E2有相同的属性名,则
    在这里插入图片描述
    二、查询树的启发式优化
    典型的启发式规则
    (1)选择运算应尽可能先做
    在优化策略中这是最重要、最基本的一条。
    (2)把投影运算和选择运算同时进行
    如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系。
    (3) 把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系。
    (4) 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
    (5) 找出公共子表达式

    • 如果这种重复出现的子表达式的结果不是很大的关系
    • 并且从外存中读入这个关系比计算该子表达式的时间少得多
    • 则先计算一次公共子表达式并把结果写入中间文件是合算的。
    • 当查询的是视图时,定义视图的表达式就是公共子表达式的情况

    物理优化

    • 代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径
    • 对于一个查询语句有许多存取方案,它们的执行效率不同, 仅仅进行代数优化是不够的
    • 物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划

    物理优化方法

    • 基于规则的启发式优化
      启发式规则是指那些在大多数情况下都适用,但不是在每种情况下都是适用的规则。
    • 基于代价估算的优化
      优化器估算不同执行策略的代价,并选出具有最小代价的执行计划。
    • 两者结合的优化方法
      常常先使用启发式规则,选取若干较优的候选方案,减少代价估算的工作量
      然后分别计算这些候选方案的执行代价,较快地选出最终的优化方案

    一、基于启发式规则的存取路径选择优化
    1.选择操作的启发式规则
    对于小关系,使用全表顺序扫描,即使选择列上有索引
    对于大关系,启发式规则有:
    (1)对于选择条件是“主码=值”的查询

    • 查询结果最多是一个元组,可以选择主码索引
    • 一般的关系数据库管理系统会自动建立主码索引

    (2)对于选择条件是“非主属性=值”的查询,并且选择列上有索引

    • 要估算查询结果的元组数目
    • 如果比例较小(<10%)可以使用索引扫描方法
    • 否则还是使用全表顺序扫描

    (3)对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引
    要估算查询结果的元组数目:

    • 如果比例较小(<10%)可以使用索引扫描方法
    • 否则还是使用全表顺序扫描

    (4)对于用AND连接的合取选择条件

    • 如果有涉及这些属性的组合索引
      优先采用组合索引扫描方法
    • 如果某些属性上有一般的索引,可以用索引扫描方法
      通过分别查找满足每个条件的指针,求指针的交集
      通过索引查找满足部分条件的元组,然后在扫描这些元组时判断是否满足剩余条件
    • 其他情况:使用全表顺序扫描

    (5)对于用OR连接的析取选择条件,一般使用全表顺序扫描

    2.连接操作的启发式规则
    (1)如果2个表都已经按照连接属性排序

    • 选用排序-合并算法

    (2)如果一个表在连接属性上有索引

    • 选用索引连接算法

    (3)如果上面2个规则都不适用,其中一个表较小

    • 选用Hash join算法

    (4)可以选用嵌套循环方法,并选择其中较小的表,确切地讲是占用的块数(b)较少的表,作为外表(外循环的表) 。理由:

    • 设连接表R与S分别占用的块数为Br与Bs
    • 连接操作使用的内存缓冲区块数为K
    • 分配K-1块给外表
    • 如果R为外表,则嵌套循环法存取的块数为Br+BrBs/(K-1)
    • 显然应该选块数小的表作为外表

    二、基于代价的优化

    • 启发式规则优化是定性的选择,适合解释执行的系统
      解释执行的系统,优化开销包含在查询总开销之中
    • 编译执行的系统中查询优化和查询执行是分开的
      可以采用精细复杂一些的基于代价的优化方法

    1.统计信息

    基于代价的优化方法要计算查询的各种不同执行方案的执行代价,它与数据库的状态密切相关
    优化器需要的统计信息
    (1)对每个基本表

    • 该表的元组总数(N)
    • 元组长度(l)
    • 占用的块数(B)
    • 占用的溢出块数(BO)

    (2)对基表的每个列

    • 该列不同值的个数(m)
    • 列最大值
    • 最小值
    • 列上是否已经建立了索引
    • 哪种索引(B+树索引、Hash索引、聚集索引)
    • 可以计算选择率(f)
      如果不同值的分布是均匀的,f=1/m。
      如果不同值的分布不均匀,则要计算每个值的选择率,f=具有该值的元组数/N。

    (3)对索引

    • 索引的层数(L)
    • 不同索引值的个数
    • 索引的选择基数S(有S个元组具有某个索引值)
    • 索引的叶结点数(Y)

    2.代价估算示例
    (1)全表扫描算法的代价估算公式

    • 如果基本表大小为B块,全表扫描算法的代价 cost=B
    • 如果选择条件是“码=值”,那么平均搜索代价 cost=B/2

    (2)索引扫描算法的代价估算公式

    如果选择条件是“码=值”

    • 则采用该表的主索引;
    • 若为B+树,层数为L,需要存取B+树中从根结点到叶结点L块,再加上基本表中该元组所在的那一块,所以cost=L+1

    如果选择条件涉及非码属性

    • 若为B+树索引,选择条件是相等比较,S是索引的选择基数(有S个元组满足条件)
    • 满足条件的元组可能会保存在不同的块上,所以(最坏的情况)cost=L+S

    如果比较条件是>,>=,<,<=操作

    • 假设有一半的元组满足条件
    • 就要存取一半的叶结点
    • 通过索引访问一半的表存储块
    • cost=L+Y/2+B/2
    • 如果可以获得更准确的选择基数,可以进一步修正Y/2与B/2

    (3)嵌套循环连接算法的代价估算公式

    嵌套循环连接算法的代价
    cost=Br+BrBs/(K-1)
    如果需要把连接结果写回磁盘
    cost=Br+Br Bs/(K-1)+(Frs*Nr*Ns)/Mrs

    • 其中Frs为连接选择性(join selectivity),表示连接结果元组数的比例
    • Mrs是存放连接结果的块因子,表示每块中可以存放的结果元组数目

    (4)排序-合并连接算法的代价估算公式

    • 如果连接表已经按照连接属性排好序,则
      cost=Br+Bs+(Frs*Nr*Ns)/Mrs
    • 如果必须对文件排序
      还需要在代价函数中加上排序的代价
      对于包含B个块的文件排序的代价大约是
      (2*B)+(2*B*log2B)

    ==查询处理是关系数据库管理系统的核心,查询优化技术是查询处理的关键技术 ==

    展开全文
  • 6-1数据库查询处理与优化

    千次阅读 2016-06-30 13:17:54
    6-1数据库查询处理与优化tags:数据库关系数据库的查询处理 查询处理是关系数据库管理系统执行查询语句的过程,其任务是把用户提交给关系数据库管理系统的查询语句转换为高效的查询执行计划 相关名词解释SQL词法分析...

    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+树索引,该索引的层数,不同索引值的个数,索引的选择基数,索引的叶节点数.

    展开全文
  • 9.1.1 查询处理步骤 关系数据库管理系统查询处理阶段 : 1. 查询分析 2. 查询检查 3. 查询优化 4. 查询执行  9.1.2 实现查询操作的算法示例 1.选择操作的实现 选择操作典型实现方法: (1) 全表...
  • 9.1.1 查询处理步骤 关系数据库管理系统查询处理可以分为4个阶段:查询分析、查询检查、查询优化和查询执行 查询分析:词法分析、语法分析 查询检查:语义分析、是否有权限、是否破坏完整性、视图转换 查询优化...
  • 数据库处理一个查询步骤

    千次阅读 2019-10-23 16:21:17
    1. 客户端发送一条查询给服务器; 2. 服务器先会检查查询缓存query cache,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段; 3. 服务器端进行SQL解析parsing、预处理transition,再由优化器...
  • 关系查询处理与优化 目录 关系查询处理与优化 ...1、查询处理步骤 2、查询树的启发式优化规则(P284) 习题:P290 5 综合题   9.1 关系数据库系统的查询处理   9.2 关系数据库系统的...
  • 9.1.1 查询处理步骤 查询分析:词法分析、语法分析 查询检查:语义分析、是否有权限、是否破坏完整性、视图转换 查询优化:代数优化(逻辑优化)和物理优化(基于规则、代价、语义),生成查询计划树 查询执行:自...
  • 关于数据库系统的查询处理

    千次阅读 2021-04-01 21:20:49
    查询处理步骤 关系数据库管理系统查询处理可以分为四个阶段:查询分析,查询检查,查询优化和查询执行。 1.查询分析 首先对查询语句进行扫描,语法分析和词法分析,即判断查询语句是否符合SQL语句,关键词,语法结构...
  • 虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声...9.1.1查询处理步骤 9.1.2实现查询操作的算法示例 9.2关系数据库系统的查询优化 9.2.1查询优化概述 9.2....
  • 关系数据库查询优化

    千次阅读 2012-09-19 19:48:00
    最近在忙着找工作,每次和面试官谈到所参与的项目时,总觉得可说的东西不...从查询的多个执行策略中进行合理选择的过程就是“查询处理过程中的优化”,简称为查询优化。 由关系DBMS自动生成若干候选查询计划并且从中选
  • 第9章 关系查询处理和查询优化(数据库系统概论)

    万次阅读 多人点赞 2010-07-08 11:43:00
    第9章 关系查询处理和查询优化(数据库系统概论)
  • informix数据库锁表处理步骤

    千次阅读 2016-05-03 15:26:14
    时间:2016/5/3 ...1、onstat -ks|grep HDR+X //查询是那个表被锁 address wtlist owner lklist type tblsnum rowid key#/bsiz c1809510 0 d656e774 c181cb3c HDR+X 6002e1 2c602 0 需要关
  • JDBC连接数据库6个步骤

    万次阅读 多人点赞 2018-11-01 09:46:27
    JDBC连接数据库,创建一个以JDBC连接数据库的程序,包含7个步骤:  首先准备JDBC所需的四个参数(user,password,url,driverClass) (1)user用户名 (2)password密码 (3)URL定义了连接数据库时的协议、...
  • 数据库连接的步骤

    千次阅读 2017-08-16 16:57:50
    •创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String ...
  • JDBC连接数据库的详细步骤

    千次阅读 2016-08-18 18:47:30
    •创建一个以JDBC连接数据库的程序,包含7个步骤:  1、加载JDBC驱动程序:  在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),  这通过java.lang.Class类的静态方法forName(String ...
  • 这些框架都对数据库连接池有很好的封装,可能忽略了数据库底层的实现,今天我们就一起来看看如何手写一个简易的数据库连接池,在此之前我们先回忆一下java连接数据库步骤: 注册加载jdbc数据库驱动 第一,把驱动...
  • jdbc连接数据库的基本步骤

    千次阅读 2019-03-13 11:48:58
    jdbc连接数据库的基本步骤 精简版 1.在项目中导入java.sql包 2.加载数据库驱动程序 3.定义数据库的链接地址 4.得到与数据库的连接对象 5.声明sql语句 6.得到语句对象 7.执行sql语句 8.处理sql语句的返回结果 9....
  • JDBC连接数据库7个步骤

    千次阅读 2019-06-19 10:08:39
    JDBC连接数据库7个步骤 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1、JDBC所需的四个参数(user,password,url,driverClass) (1)user用户名 (2)password密码 (3)URL定义了连接...
  • Java访问数据库的具体步骤

    千次阅读 2018-06-08 15:28:40
    1.加载(注册)数据库驱动加载就是把各个数据库提供的访问数据库的API加载到我们程序...下面看一下一些主流数据库的JDBC驱动加裁注册的代码://Oracle8/8i/9iO数据库(thin模式)Class.forName("oracle.jdbc.driv...
  • 数据库系统查询优化的步骤

    千次阅读 2008-10-24 22:53:00
    数据库系统查询优化的总目标是:选择有效的策略,求得给定关系表达式的值,实际系统对查询优化的具体实现不尽相同,但一般来说,可以归纳为四个步骤:1.将查询转化为某种内部表示,通常是语法树.2.根据一定的等价变换规则把...
  • kettle的javascript步骤自己写代码连接数据库,实现查询,更加灵活,一些业务场景中会用到。
  • 数据库连接七步骤

    千次阅读 2012-09-29 08:25:41
     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。  例如:   try{ //加载MySql的驱动类 Cl
  • Java连接MySQL数据库——含步骤和代码

    万次阅读 多人点赞 2019-06-01 23:59:22
    60 //数据库连接失败异常处理 61 e.printStackTrace(); 62 }catch (Exception e) { 63 // TODO: handle exception 64 e.printStackTrace(); 65 }finally{ 66 System.out.println("数据库数据成功获取!!"); 67 } ...
  • 操作数据库的基本步骤

    千次阅读 2019-04-02 22:15:39
    操作数据库的可以简单分为五个步骤 贾琏欲执事 贾 : 加载JDBC驱动程序 //加载MySql的驱动类 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out....
  • 连接数据库 六大步骤

    千次阅读 2017-04-12 19:28:30
    连接数据库: 1.加载驱动: Class.forName(); 2.获取连接: DriverManager.getConnection(); 3.创建处理对象: 获取连接对象.createStatement(); 4.编写sql语句: sql语句!  5.执行sql语句: statement....
  • 执行数据库8步骤

    千次阅读 多人点赞 2018-12-12 19:53:59
    操作数据库,拼接SQL语句,执行SQL语句 ... * 操作数据库步骤  * 3.1导入操作数据库的jar  * 3.2数据库驱动  * 3.3创建连接对象  * 3.4定义SQL语句  * 3.5创建执行SQL语句的对象  * 3.6执行SQL语句  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,713
精华内容 93,085
关键字:

关系数据库查询处理步骤