数据库原理-外部归并排序-习题1

问题:如何使用 8 个帧的 RAM 对 1960 个页的表进行外部归并排序?

目标:充分利用 8 个帧的内存高效地对所有页进行排序。

整体流程:

  • 第 1 趟:使用全部 8 个帧,将全部页划分为⌈19608⌉=245\lceil\frac{1960}{8}\rceil=245⌈81960⌉=245 个长度为 888 的有序段
  • 第 2 趟:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 245 个长度为 8 的有序段进行归并排序,得到⌈2457⌉=35\lceil\frac{245}{7}\rceil=35⌈7245⌉=35 个长度为 7∗8(56)7*8(56)7∗8(56) 的有序段。
  • 第 3 趟:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 35 个长度为 7∗8(56)7*8(56)7∗8(56) 的有序段进行归并排序,得到⌈357⌉=5\lceil\frac{35}{7}\rceil=5⌈735⌉=5 个长度为 7∗7∗8(392)7*7*8(392)7∗7∗8(392) 的有序段。
  • 第 4 趟:使用 5 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 5 个长度为 7∗7∗8(392)7*7*8(392)7∗7∗8(392) 的有序段进行归并排序,得到⌈57⌉=1\lceil\frac{5}{7}\rceil=1⌈75⌉=1 个长度为 1960(<7∗7∗7∗8=27441960(< 7*7*7*8=27441960(<7∗7∗7∗8=2744 的有序段。

划分有序段

第 1 趟:利用 8 个帧,将全部页划分为⌈19608⌉=245\lceil\frac{1960}{8}\rceil=245⌈81960⌉=245 个长度为 888 的有序段

txt 复制代码
0 号有序段:p0,p1,...,p7
1 号有序段:p8,p9,...,p17
...
244 号有序段:p1952,p1953,...,p1959

对长度为 8 的有序段进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为888的有序段进行归并排序,共需进行 ⌈2457⌉=35\lceil\frac{245}{7}\rceil=35⌈7245⌉=35 次迭代。

第 1 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-6 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 0。

txt 复制代码
长度为 8                                长度为 7*8(56)
0号有序段 1号有序段 ... 6号有序段 ->  0号有序段

第 2 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第 7-13 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 1。

txt 复制代码
长度为 8                                长度为 7*8(56)
7号有序段 8号有序段 ... 13号有序段 ->  1号有序段

...

第 35 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第 238-244 号长度为888的有序段接着进行归并排序,得到一个长度为7∗8=567*8=567∗8=56的新有序段 34。

txt 复制代码
长度为 8                                长度为 7*8(56)
238号有序段 239号有序段 ... 244号有序段 ->  34号有序段

对有序段长度为7∗8=567*8=567∗8=56进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,共需进行 ⌈357⌉=5\lceil\frac{35}{7}\rceil=5⌈735⌉=5 次迭代。

第 1 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-6 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 0。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
0号有序段 1号有序段 ... 6号有序段 ->  0号有序段

第 2 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第7-13 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 1。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
7号有序段 8号有序段 ... 13号有序段 ->  1号有序段

...

第 5 次迭代:使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第28-34 号长度为7∗8=567*8=567∗8=56的有序段接着进行归并排序,得到一个长度为7∗7∗8=3927*7*8=3927∗7∗8=392的新有序段 4。

txt 复制代码
长度为 7*8(56)                                长度为 7*7*8(392)
28号有序段 29号有序段 ... 34号有序段 ->  4号有序段

对有序段长度为 7∗7∗8=3927*7*8=3927∗7∗8=392 进行归并排序

使用 7 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对长度为7∗8∗8=3927*8*8=3927∗8∗8=392的有序段接着进行归并排序,共需进行 ⌈57⌉=1\lceil\frac{5}{7}\rceil=1⌈75⌉=1 次迭代。

第 1 次迭代:使用 5 个帧作为输入缓冲区,1 个帧作为输出缓冲区,对 第0-4 号长度为7∗7∗8=3927*7*8=3927∗7∗8=392的有序段接着进行归并排序,得到一个长度为1960(<7∗7∗7∗8=2744)1960(<7*7*7*8=2744)1960(<7∗7∗7∗8=2744)的新有序段 0,即完成了对所有页的排序。

txt 复制代码
长度为 7*7*8(392)                                长度为 1960(<7*7*7*8=2744)
0号有序段 1号有序段 2号有序段 3号有序段 4号有序段 ->  0号有序段

相关推荐
自由能燃气设备14 分钟前
燃气容积式热水器厂家选购指南:2026年商用热水设备采购避坑手册
大数据·数据库·数据仓库·人工智能
oradh29 分钟前
Oracle数据文件的大小和数量的限制总结
数据库·oracle·数据文件大小限制·数据文件数量限制
刘某的Cloud31 分钟前
Galera Cluster部署 mariadb 节点down机,log sequence number恢复
linux·运维·数据库·负载均衡·mariadb·集群·高可用
xiaohaiAIgeo32 分钟前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识
SelectDB34 分钟前
Apache Doris 4.1 Spill to Disk:避免运行内存密集型查询发生 OOM
数据库
范什么特西1 小时前
redis题目面渣重点
数据库·redis·缓存
TDengine (老段)2 小时前
TDengine taosAdapter — 多协议网关详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Nturmoils2 小时前
SQL Server 迁移到 KingbaseES:一次复杂 BI 查询的性能实测
数据库
今天AI了吗3 小时前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql
灯澜忆梦3 小时前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化