用户输入一个sql语句 sql解析器 将sql语句转换成一个 关系代数 但是同时也会附加一些 操作 (下方未体现)。
外存排序 原理
外部数据元素太多无法一次性的读入内存 通常设计者 会让磁盘块的大小和缓冲区的大小相等 。
首先构造初始的归并段
分别从横向和纵向 体会这个过程 得到初始归并段的目的是让每一个子块都是有序。
由于缓冲区是在内存 生成的归并段会自动排序 然后将这些段写入到文件中。
宏观---初始和结果
多路归并
算法思想
简单示例
1
取每一趟的最小段再次进行归并
如果缓冲区 1空了 让归并段1的块进入内存。
2
注意 每次需要找出一个最小值Key 然后找出 所有的key 并输出到文件中 如果块发生缺页 就从缓冲区 中调入页 然后继续查找Key值 直到 测试的时候 没有key并且 所有的缓冲块都不是空 重新更新Key 直到所有的元组都输入到缓冲区里。
算法I/O复杂性分析
前提
输出不计入IO代价:
- 输出结果IO 可以输出到文件中 实际上 如果DBMS 如果结果不大的话 输出结果可以给下一个查询使用 也就是说输出结果可以放在内存中使用。让后续的操作直接从内存中取走并不需要通过文件作为当前结果的媒介
- 输出结果需要有内存缓冲区 装元组 装满之后输出缓冲区的内容会往文件中 输出缓冲区的页数不计入内存的可用的页数。可以算到下一个操作的 选择的操作下一个操作是投影 可以把选择操作的代价 算到投影上。
IO复杂性分析
IO代价 3B(R)
- 从内存中读取数据
- 在归并阶段 扫描文件
- 将归并段写入文件
可用内存页数要求 B(R)
多趟多路归并