目录
第一种情况:Q1=πSname (σStudent.Sno=SC.Sno∧Sc.Cno='2' Student×SC))
第二种情况:Q2=πSname (σSc.Cno='2' (Student SC)
第三种情况 Q3=πSname (Student σSc.Cno='2'(SC))
排序-合并方法(sort-merge join 或merge join)
选择操作典型实现方法:
- 嵌套循环方法(nested loop)
- 排序-合并方法(sort-merge join 或merge join)
- 索引连接(index join)方法
- Hash Join方法
集中式数据库执行开销主要包括:
- 磁盘存取块数(I/O代价)
- 处理机时间(CPU代价)
- 查询的内存开销
I/O代价是最主要的。
分布式数据库:总代价=I/O代价+CPU代价+内存代价+通信代价
简单的全表扫描方法
具体步骤
- 对查询的基本表顺序扫描,逐一检查每个元组是否满足 选择条件,把满足条件的元组作为结果输出
- 适合小表,不适合大表
全表扫描算法的代价估算公式
- 如果基本表大小为B块,全表扫描算法的代价 cost=B
- 如果选择条件是码=值,那么平均搜索代价 cost=B/2
嵌套循环方法(nested loop)
具体步骤
- 对外层循环(Student)的每一个元组(s),检索内层循环 (SC)中的每一个元组(sc)
- 检查这两个元组在连接属性(sno)上是否相等
- 如果满足连接条件,则串接后作为结果输出,直到外 层循环表中的元组处理完为止
代价估算 :分为三种情况
第一种情况:Q1=πSname (σStudent.Sno=SC.Sno∧Sc.Cno='2' Student×SC))
1. 计算广义笛卡尔积
把Student和SC的每个元组连接起来的做法:
- 在内存中尽可能多地装入某个表(如Student表)的若干块,留出一块 存放另一个表(如SC表)的元组。
- 把SC中的每个元组和Student中每个元组连接,连接后的元组装满 一块后就写到中间文件上
- 从SC中读入一块和内存中的Student元组连接,直到SC表处理完。
- 再读入若干块Student元组,读入一块SC元组
- 重复上述处理过程,直到把Student表处理完
设一个块能装10个Student元组或100个SC元组,在内存 中存放5块Student元组和1块SC元组,则读取总块数为 1000/10+(1000/50) * (10000/100) =100+20×100=2100块
其中,读Student表100块。读SC表20遍,每遍100块。 若每秒读写20块,则总计要花10^5s
连接后的元组数为10^3×10^4=10^7 。设每块能装10个元组, 则写出这些块要用10^6/20=5×10^4s
2. 作选择操作
- 依次读入连接后的元组,按照选择条件选取满足要求 的记录
- 假定内存处理时间忽略。读取中间文件花费的时间(同 写中间文件一样)需5×10^4s
- 满足条件的元组假设仅50个,均可放在内存
3. 作投影操作
- 把第2步的结果在Sname上作投影输出,得到最终结果
- 第一种情况下执行查询的总时间≈10^5