【数据库原理】查询处理与查询优化

查询处理

典型索引结构

Hash索引

  1. 散列函数
  • 将索引的键值(Key)散列在B个桶(bucket)中。
  • 每个桶对应一个索引项
  • 将每个Key作为参数,计算出一个介于0到B-1的整数。
  • 当Key为整数时常见的选择是计算Key/B的余数,通常B选为一个素数,也可以选2的幂。
  • 当Key为字符串时,可以把每个字符看作一个整数来处理,将它们累加起来再除以B取余数。

B+树索引

  1. 由参数n决定存储块的布局。
  2. 每个存储块存放n个健值和n+1个指针。

顺序文件索引

1.稠密索引

2.稀疏索引

选择运算的查询处理

  1. 查询实例 select * from Students where <条件表达式>;
  2. 条件表达式的几种情况
  • C1:无条件
  • C2:Sno = ‘2011003’;
  • C3:Sdept = ‘CS’;
  • C4:Sage > 20;
  • C5:Sdept = ‘CS’ and Sage > 20;
  1. 假设Students关系的信息如下
    Students的记录数:n1
    Students所占的磁盘块数: b

C1

  1. 查询实例 select * from Students;
  • 文件扫描:线性搜索
    适用于任何文件;不要求有序;不要求构建索引;不限制选择运算的条件

C2

C3


C4

C5

  1. 查询实例: select * from Students where Sdept = ‘CS’ and Sage > 20

合取选择查询

  • 利用索引找到符合各个条件的元组指针,取指针的交集;或者
  • 找到符合第一个条件的元组指针,在此范围内检查另一条件是否满足

析取选择查询:

  • 每个条件属性上都有索引 è 利用索引找到符合各个条件的元组指针,取指针的并集;
  • 否则 -> 线性扫描

连接运算的查询处理

多关系处理

临时关系物化(materialized)-- 查询树(operator tree)

流水线(pipeline)

  1. 流水线(pipeline)
  • 将表达式中多个关系运算组合成一个操作流水线(将一个运算的结果作为输入,直接传送到下一个运算)
  • 减少查询执行中产生的临时文件数量,节省磁盘I/O操作
  • 系统创建缓存区保存上下层操作间需要传递的元组
  1. 执行方式
  • 拉:需求驱动,系统不停地向位于流水线顶端的操作发出需要元组的请求。
  • 推:生产者驱动,各个运算并不等待元组请求,而是不停地产生元组并输出到缓冲区,直到缓冲区满。
posted @ 2022-11-28 18:57  Mothlove  阅读(191)  评论(0)    收藏  举报