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

B+树索引
- 由参数n决定存储块的布局。
- 每个存储块存放n个健值和n+1个指针。

顺序文件索引
1.稠密索引

2.稀疏索引

选择运算的查询处理
- 查询实例
select * from Students where <条件表达式>; - 条件表达式的几种情况
- C1:无条件
- C2:Sno = ‘2011003’;
- C3:Sdept = ‘CS’;
- C4:Sage > 20;
- C5:Sdept = ‘CS’ and Sage > 20;
- 假设Students关系的信息如下
Students的记录数:n1
Students所占的磁盘块数: b
C1
- 查询实例
select * from Students;
- 文件扫描:线性搜索
适用于任何文件;不要求有序;不要求构建索引;不限制选择运算的条件

C2

C3


C4

C5
- 查询实例:
select * from Students where Sdept = ‘CS’ and Sage > 20
合取选择查询
- 利用索引找到符合各个条件的元组指针,取指针的交集;或者
- 找到符合第一个条件的元组指针,在此范围内检查另一条件是否满足
析取选择查询:
- 每个条件属性上都有索引 è 利用索引找到符合各个条件的元组指针,取指针的并集;
- 否则 -> 线性扫描
连接运算的查询处理

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

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


浙公网安备 33010602011771号