数据库系统概论笔记(9)

第9章关系查询处理和查询优化

查询处理:增删改查
查询优化:包括代数优化(逻辑优化)、物理优化(非代数优化)

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

查询处理步骤

查询处理的四个阶段:查询分析、查询检查、查询优化、查询执行

  • 查询分析:对查询语句进行扫描、词法分析和语法分析
  • 查询检查:包括合法权检查、视图转换、完全性检查、完整性初步检查
  • 查询优化:选择一个高效执行的查询处理策略
    代数优化:关系代数表达式的优化
    物理优化:存取路径和底层操作算法的选择(选择依据有基于规则、基于代价、基于语义)
  • 查询执行:代码生成器生成查询代码,执行代码,回送查询结果

实现查询操作的算法示例

选择操作的实现:

  • 全表扫描算法:
    对基本表顺序全部扫描
    适合小表,不适合大表
  • 索引扫描方法:
    索引找到元组指针,根据指针在基本表中找到元组
    适于选择条件中的属性上有索引(B+树索引、hash索引等)
    (当选择率低时基于索引的选择算法比较好,当选择率比较高时全表扫描算法比较好)

连接操作的实现:
(最常用最耗时的操作之一)

  • 嵌套循环算法:
    最简单可行的算法
    全表选择是嵌套循环算法
    时间复杂度:n1+n1×n2+n3
    (n1是R表的元组数,n2是S表的元组数,n3是合并后表的元组数)
  • 排序-合并算法:
    等值连接最常用的算法
    *时间复杂度:n1+(n1+n2)+n3+n1logn1+n2logn2
    (扫R表+R表扫描无效+S表扫描有效+连接+S表排序+R表排序)
  • 索引连接算法:
    步骤:
     SC表上有Sno的索引
     对Student中的每个元组,由Sno值通过Sc的索引查找相应的SC元组
     把SC元组和Student元组连接起来
    时间复杂度:(n1logn1+n2logn2)×2+n3(不管原理)
  • hash join算法:
    把连接属性作为hash码,用同一个hash函数把Student表和SC表中的元组散列到hash表中,再根据hash表进行等值连接
    *时间复杂度:n1H(x1)+n2H(x2)+n2MH(n2)+n3(M是内存块大小,不管原理)

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

查询优化概述

优点:

  1. 用户不必考虑如何最好的表达查询以获得较好的效率
  2. 系统可以比用户程序的“优化”做得更好

执行开销:

  1. 集中式数据库:总代价 = I/O代价+CPU代价+内存代价
  2. 分布式数据库:总代价 = I/O代价+CPU代价+内存代价+通信代价

代数优化:有选择和连接操作时,先做选择操作(这样参加连接的元组可以大大减少)

9.3代数优化

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

目的:通过对关系代数表达式的等价变换来提高查询效率

等价变换规则(要会相应的查询树转换):

  • 交换律:
    连接与笛卡尔积、选择与投影、选择与笛卡尔积
  • 结合律:
    连接与笛卡尔积
  • 串接律
    选择、投影
  • 分配律:
    选择与并、选择与差、选择与自然连接、投影与笛卡尔积、投影与并

查询树:

  • 叶子是关系表达式
  • 自底向上阅读,最顶上的结果为查询结果
  • 几目运算符就只能有几个分叉(向下的分叉)

查询树的启发式优化

典型的启发式规则:

  1. 选择尽早做
  2. 选择投影同时进行
  3. 投影结合前后的的双目运算
  4. 选择结合前面的笛卡尔积(形成连接)
  5. 找公共子表达式

关系表达式的优化算法:

  • 输入输出:
    输入:一个关系表达式的查询树
    输出:优化的查询树
  • 方法:
     1)运用选择的串接律,把选择条件拆开分别进行
     2)选择尽可能靠近叶子端
      遇到选择和投影直接下沉,遇到双目运算则考虑下沉到相关分支或不下沉
     3)投影尽可能靠近叶子端
      遇到选择若在投影属性范围内则直接下沉,否则在选择下增加新投影下沉(原投影不下沉)
      遇到投影,合并
      遇到双目运算,下沉到相关分支或不下沉
     4)合并选择与投影操作
      合成单个选择或单个投影(即同时执行,内容上可能无变化)、或一选择后跟一投影
     5)把语法树的内结点分组
      双目运算符与直接祖先为一组(祖先只能是选择和投影),若后代直到叶子全是单目,也并为一组
      若双目运算是笛卡尔积,且后面不是选择,则应该把这些单目运算单独分组

优化过程要画的三种树:

  • 三种树:原始语法树(sql语法树)-> 代数语法树 -> 优化后的代数语法树
  • 转换过程:翻译sql为原始语法树 -> 将sql语法树拆成代数语法树 -> 对代数语法树进行优化

9.4物理优化

目的:选择高效合理的操作算法或存取路径,求得优化的查询计划
可用的方法:

  • 基于规则的启发式优化
  • 基于代价估算的优化
  • 两者结合的优化方法

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

选择操作的启发式规则

  • 小关系:全表扫描
  • 大关系:
    若选择条件是“主码=值”,则可以选择主码索引
    若选择条件是“非主属性=值”,则根据查询结果的数目比例选择索引扫描还是全表扫描

连接操作的启发式规则

  • 若两个表都已按照属性排序,则选用排序-合并算法
  • 若表在连接属性上有索引,可以选用索引连接算法
  • 若其中一个表较小,可以选用hash join算法
  • 选用循环嵌套算法,选择小表作为外循环的表

*基于代价估算的优化

统计信息内容:每个基本表、基本表的每个列、索引等信息

代价估算:

  • 全表扫描算法:
    基本表大小是B块,全表扫描低价:cost=B
    选择条件是“码=值”,平均搜索代价:cost=B/2
  • 索引扫描算法:
    L层的B+树,选择条件是“码=值”:cost=L+1
    L层的B+树,选择条件涉及非码属性:cost=L+S(有S个元组满足条件,这S个元组可能都在不同的块上,即最坏情况)
    L层的B+树,选择条件是比较操作,假设有一般的元组满足条件:cost=L+Y/2+B/2(Y是B+树叶子占用块数,B是基本表占用的块数)
  • 循环嵌套连接算法:
    连接结果不写回磁盘:cost=Br+BrBs/(K1)(Br为外表R的占用块数,Bs为内表S的占用块数,小表为外表所以有Br<Bs)
    连接结果写回磁盘:cost=Br+BrBs/(K1)+(FrsNrNs)/Mrs(Frs为连接选择率,Nr为R表元组数,Ns为S表元组数,Mrs为每块存储的连接元组数)
  • 排序-合并连接算法:
    已按连接属性排好序:cost=Br+Bs+(FrsNrNs)/Mrs
    未按连接属性排好序:cost=Br+Bs+(FrsNrNs)/Mrs+(2B)+(2Blog2B)(后半部分为对包含B个块的文件排序的代价)
posted @   kksk43  阅读(157)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
特效
黑夜
侧边栏隐藏
点击右上角即可分享
微信分享提示