数据库原理-外部归并排序-习题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号有序段

相关推荐
海南java第二人2 小时前
Nebula Graph 实战:基于图数据库存储 CMDB 实体关系
数据库·图数据库·nebula
曹牧2 小时前
oracle:“not all variables bound”
数据库·oracle
数据库百宝箱2 小时前
Oracle RMAN Image Copy 本地恢复
数据库·oracle
zuYM4g7Dp3 小时前
NoSql数据库设计心得
数据库·nosql
睡不醒男孩0308235 小时前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love6 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
swordbob6 小时前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
牛油果子哥q6 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发6 小时前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
数据库小学妹7 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai