0
点赞
收藏
分享

微信扫一扫

中科大高级数据库2023秋——作业及答案

九月的栩 2024-06-26 阅读 16

Homework #1

1. 磁盘块延迟问题

假设某块磁盘的参数如下:容量为 1 T B 1TB 1TB,磁盘转速为 7200 R P M 7200RPM 7200RPM,最大寻道时间为
20 m s 20ms 20ms,平均寻道时间为 5 m s 5ms 5ms,最小寻道时间为 0.5 m s 0.5ms 0.5ms(指磁头寻道到相邻磁道的时
间),一个磁道大小为 64 M B 64MB 64MB。如果磁盘块大小为 16 K B 16KB 16KB,请回答下面问题(所有结果均四舍五入保留小数点后 1 位):
(1)随机读取一个磁盘块的平均延迟是多少( m s ms ms)?
(2)如果要读取 1000 个磁盘块,并且这些磁盘块在单个磁道上连续存储,此时读取这
1000 个磁盘块最少需要多少时间、最坏情况下需要多少时间、平均情况下需要多少
时间?(单位: m s ms ms

【提示】 读取一个磁盘块的延迟时间 = 寻道时间 + 旋转时间 + 传输时间。

当需要从磁盘读取数据时,系统会将数据的逻辑地址传给磁盘。磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即 确定要读取的数据在哪个磁道、哪个扇区。这个过程涉及到磁盘的结构,包括 盘片、磁道、扇区和柱面

  • 盘片:一个磁盘由多个盘片叠加而成,每个盘片上都有多个磁道。
  • 磁道:磁盘的表面被划分成多个同心圆,每个同心圆就是一个磁道。磁道上的数据块也被称为扇区。
  • 扇区:扇区是磁盘的最小物理存储单元,通常为 512 字节。一个磁盘块可以包括多个扇区。
  • 柱面:柱面是一个虚拟的概念,由同一半径位置的多个磁道组成。

磁盘的物理地址由柱面号、盘面号和扇区号来定位。

在这里插入图片描述

读取一个磁盘块的步骤:

  • 第一步,磁头定位柱面(磁盘块在哪个半径大小的磁道上),这是寻道时间;
  • 第二步,磁盘转动到要读取的数据块的那个扇区,这是旋转时间;
  • 第三步,磁盘继续转动,直到读完要读的数据块(一个数据块可能包含多个扇区),这是传输时间,本质上还是旋转。

【解】
(1)
因为磁盘转速为 7200转/分钟,所以磁盘旋转一周的时间为 60 s / 7200 ≈ 8.3 m s 60s/7200≈8.3ms 60s/72008.3ms,则平均旋转延迟时间为 8.3 m s / 2 ≈ 4.2 m s 8.3ms/2≈4.2ms 8.3ms/24.2ms

一个磁道大小为 64 M B 64MB 64MB,磁盘块大小为 16 K B 16KB 16KB,所以读取一个磁盘块的传输时间为 ( 16 K B / 64 M B ) × 8.3 m s = 0.002 m s (16KB/64MB) ×8.3ms=0.002ms (16KB/64MB)×8.3ms=0.002ms

则读取一个磁盘块的平均延迟时间=平均寻道时间+平均旋转时间+传输时间 = 5 m s + 4.2 m s + 0.002 m s ≈ 9.2 m s =5ms+4.2ms+0.002ms≈9.2ms =5ms+4.2ms+0.002ms9.2ms

(2)
最好情况:正好从磁头所在位置开始读取数据,没有寻道时间和旋转时间。
1000个磁盘块的传输时间为 ( 1000 × 16 K B / 64 M B ) × 8.3 m s ≈ 2.0 m s (1000×16KB/64MB)×8.3ms≈2.0ms (1000×16KB/64MB)×8.3ms2.0ms
则最少时间=最好情况寻道时间+最好情况旋转时间+传输时间 = 0 + 0 + 2.0 m s = 2.0 m s =0+0+2.0ms=2.0ms =0+0+2.0ms=2.0ms

最坏情况:最大寻道时间为 20 m s 20ms 20ms,最大旋转时间为旋转一周的时间 8.3 m s 8.3ms 8.3ms
则最坏情况时间=最大寻道时间+最大旋转时间+传输时间 = 20 m s + 8.3 m s + 2.0 m s = 30.3 m s =20ms+8.3ms+2.0ms=30.3ms =20ms+8.3ms+2.0ms=30.3ms

平均情况:平均寻道时间为 5 m s 5ms 5ms,平均旋转时间为 4.2 m s 4.2ms 4.2ms
则平均情况时间=平均寻道时间+平均旋转时间+传输时间 = 5 m s + 4.2 m s + 2.0 m s = 11.2 m s =5ms+4.2ms+2.0ms=11.2ms =5ms+4.2ms+2.0ms=11.2ms

2. 不同的 DBMS 所采用的磁盘块策略

目前不同的 DBMS 所采用的磁盘块大小往往不同,例如 MySQL 是 16 K B 16KB 16KB,而 MS SQL
Server 是 8 K B 8KB 8KB。其它的一些系统如 HDFS 则采用了默认 64 M B 64MB 64MB 的大块。此外,像 DB2、Oracle 等还支持可变的磁盘块大小(比如从 8 K B 8KB 8KB 64 K B 64KB 64KB),但有的 DBMS(如 MS SQL Server)却采用固定的磁盘块大小( 8 K B 8KB 8KB)。针对这些现象,请回答下面的问题:
(1)DBMS 采用固定磁盘块大小和可变磁盘块大小这两种策略各有什么优缺点?
(2)目前流行的关系型 DBMS 为什么不采用 64 M B 64MB 64MB 以上的大块设计?
(3)什么样的数据库应用适合在关系型 DBMS 中采用 64 M B 64MB 64MB 这样的大块设计?试结合一两个例子给出你的分析。

【解】
(1)
可变磁盘块可以根据不同的环境给出适合的块大小,比如如果一张表上的事务总是顺序扫描,那大块就很合适,如果一张表上的随机读取很多,小块就比较合适。

固定块大小:

  • 优点:所有数据库的磁盘块大小一致,实现简单,管理方便。
  • 缺点:对于可变长度的记录,固定块大小在某些情况下空间利用率会比较低,例如 MS SQL Server 采用了固定块 8 K B 8KB 8KB,如果一条记录为 4.1 K B 4.1KB 4.1KB,则每个磁盘块的空间利用率近似为 50%,使得大约一半的存储空间被浪费。

可变块大小:

  • 优点: 可以根据记录的大小灵活选择合适的磁盘块大小,保证较高的空间利用率。
  • 缺点: 实现复杂,需要额外的元数据记录每个数据库的块大小。需要专业的数据库管理经验,随意设置块大小可能会造成数据库性能的下降。

(2)
因为关系型 DBMS 采用块作为空间分配的最小单位,而关系 DBMS 所针对的 OLTP 应用的记录大小通常都是几百或者几千字节,因此如果采用 64MB 块大小,每次分配一个磁盘块,该磁盘块将在很长一段时间里都保持较低的空间利用率。

比如一个表大小为 64.1 M B 64.1MB 64.1MB,此时需分配 2 个 64 M B 64MB 64MB 的磁盘块,实际表占用了 128 M B 128MB 128MB,导致空间利用率退化到近似 50%。

(3)
如果应用涉及的记录比较大,比如 M B MB MB 级别,则 DBMS 可以采用 64 M B 64MB 64MB 这样
的大块设计。

例子 1:用 DBMS 存储照片时,每个照片记录通常为几 M B MB MB,例如 4 M B 4MB 4MB,此时如果用MySQL 的 16 K B 16KB 16KB 块大小,则会导致一个照片记录被分割存储到 256 个磁盘块里,导致照片存取效率低。如果采用 64 M B 64MB 64MB 块大小,则可以在一个磁盘块里存储约 16 个照片记录。

例子 2:用 DBMS 存储网络爬取的 html 网页时,由于一个网页大小通常为几
K B KB KB,此时也适合用 64 M B 64MB 64MB 这样的大块存储。

例子3:在处理视频流的应用中,要连续读取和处理大量视频数据。如一个视频监控系统要实时分析数百个视频流,以便人脸识别、行为分析,可以使用大块设计减少 I/O 次数。

3. 磁盘块定长记录的增删操作

假设磁盘块大小为 8 K B KB KB,块中存储 200 字节的定长记录,块首部只包括一个 8 字节的模式指针和一个偏移量表。对于插入块内的每条记录,在偏移量表中都增加一个 2 字节的
指针指向该记录。假设每天向块内插入 4 条记录(空间不足时允许插入部分记录后结束
全部操作),删除 2 条记录。假设每天的删除记录操作总是发生在插入记录之前,删除
记录使用一个“删除标记”代替记录在偏移量表中的指针。给定一个磁盘块,如果刚开始
块是空的,则几天后不能再向该块内插入记录?此时,该块内一共有多少条记录?

【解】
第一天,插入 4 条记录,占的空间大小为 ( 200 + 2 ) × 4 = 808 B (200+2)×4=808B (200+2)×4=808B
此后每天删除 2 条记录,释放的空间大小为 2 × 200 = 400 B 2×200=400B 2×200=400B
所以每天增加所占的空间大小为 − 400 + 808 = 408 B -400+808=408B 400+808=408B

设第 x x x 天,令 808 + 408 ( x − 1 ) ≤ 8192 808+408(x-1) \le 8192 808+408(x1)8192,可求, x ≤ 19.1 x \le 19.1 x19.1
取整数 x = 19 x=19 x=19,故当第 19 天插入记录后,所占磁盘空间为 8 + 808 + 408 × 18 = 8160 B 8+808+408×18=8160B 8+808+408×18=8160B
第 20 天开始时,还剩下 32 B 32B 32B 空间,删除 2 条记录后,余下 432 B 432B 432B 空间
然后插入 2 条记录,剩余 28 B 28B 28B 空间,
插入本日第 3 条记录时,只插入了部分数据然后结束全部操作;

因此,第 20 天后不能插入记录。
此时磁盘块内一共有 4 + 2 × 18 = 40 4+2×18=40 4+2×18=40 条有效记录(此外还有 1 条无效记录)

Homework #2

1. LRU-k 算法

LRU-k 算法实际上是假设第一次访问的页面都是冷页面,而访问了 k k k 次以上的页面是热页面(所以应该尽量常驻在缓存里)。这一方法存在一个问题:如果访问的数据具有较高的局部性,会出现在若干次访问后所有的页面访问次数都大于 k k k,从而使得冷页 LRU 链表为空,此时 LRU-k 算法退化成了 LRU 算法。请首先分析这一问题出现的根本原因是什么?然后针对这一问题设计一种优化策略,使得 LRU-k 能够避免出现这种性能退化的情况。

在这里插入图片描述

【解】
根本原因就是: k k k 值只增不减。LRU-k 假设访问次数多的页面在未来更可能被访问,但是当所有页面访问次数都大于 k k k,假设不再成立,所有页面都被视为热页面,LRU-k 退化为 LRU。

比如前期访问 a a a 次数多,但后期不再访问,但它却因为次数多而仍然占据 LRU-k 的空间。

策略1:根据负载,动态调整 k k k
策略2:引入“冷却因子”参数,当有新页面访问时,就将所有页面的访问次数乘以该冷却因子(<1)。如此,即使所有页面的访问次数都大于 k k k,经过冷却因子的作用,它们的访问次数会下降,使一部分页面访问次数小于 k k k,即可避免 LRU-k 退化为 LRU。

2. LRU 缓冲区置换策略

假设我们采用 LRU 作为缓冲区置换策略,当我们向 Buffer Manager 发出一个读页请求
时,请讨论一下:
(1)如果页不在缓冲区中,我们需要从磁盘中读入该页。请问如何才能在缓冲区不满的
时候快速地返回一个 free 的 frame?请给出至少两种策略,并分析一下各自的时间复杂度。
(2)如何才能快速地判断所请求的页是否在缓冲区中?如果请求的页在缓冲区中,如何
快速返回该页对应的 frame 地址?请给出至少两种策略,并分析一下各自的时间复杂度。

【解】

在这里插入图片描述

3. Clean-First LRU 算法

我们在讲义上介绍了 SSD 感知的 CF-LRU 算法,即 Clean-First LRU 算法。该算法虽然看起来可以减少对 SSD 的写操作,但依然存在一些问题。请分析一下该算法的主要缺点有哪些?给出两点,并简要解释你的理由。

【解】

在这里插入图片描述

Homework #3

1. 文献查询索引技术

假设我们在数据库中设计了如下基本表来存储文献: p a p e r ( i d : i n t , t i t l e : v a r c h a r ( 200 ) , a b s t r a c t : v a r c h a r ( 1000 ) ) paper(id: int, title: varchar(200), abstract: varchar(1000)) paper(id:int,title:varchar(200),abstract:varchar(1000))。最常见的文献查询可以描述为“查询 title 中同时包含给定关键词
的文献”,关键词可以是一个,也可以是多个。请回答下面问题(假设所有文献都是英文文
献):

  1. 假如在 title 上创建了 B + t r e e B+tree B+tree 索引,能不能提高此查询的效率(须解释理由)?
  2. 由于文献 title 的关键词中存在很多重复词语,因此上述文献查询可以借鉴我们课上
    讲述的支持重复键值的辅助索引技术来进一步优化。请基于此思想画出一种优化的索引
    结构,简要说明该索引上的记录插入过程以及文献查询过程。

【解】

(1)
不能。文献查询并不是精确(whole-key)点查询,而是范围(partial-key)查询,查询的单词可能出现在 title 的任意位置。由于 B + B+ B+ 树是根据键的字典序排序的,仅支持前缀查询,不支持中缀和后缀范围查询。因此使用 B + B+ B+ 树结构仍要扫描所有数据项。

(2)
使用倒排索引。倒排索引根据单词索引到 title 包含该单词的所有文档。
相比于 B + B+ B+ 树结构,采用倒排索引优点如下:

  • 避免重复单词的存储
  • 对于文献查询不需要扫描所有数据项,仅通过少数几次索引查询即可完成搜索。

插入:对文档的 title 进行分词,然后将各个关键词插入到索引中。查询关键词是否已经存在,若存在;则直接将指针插入对应的桶中;若不存在,则插入关键词,增加对应的桶以及
指向文档的指针。

查询:单个关键词,返回得到的文档集合即可;多个关键词,返回各个关键词查询结果的文档集合的交集。

在这里插入图片描述

2. 可扩展散列索引和线性散列索引

假设有如下的键值,现用 5 位二进制序列来表示每个键值的 hash 值。回答问题:
A[11001] B[00111] C[00101] D[00110] E[10100] F[01000] G[00011]
H[11110] I[10001] J[01101] K[10101] L[11100] M[01100] N[11111]

1)如果将上述键值按 A A A N N N 的顺序插入到可扩展散列索引中,若每个桶大小为一个磁盘块,每个磁盘块最多可容纳 3 个键值,且初始时散列索引为空,则全部键值插入完成后该散列索引中共有几个桶?并请写出键值 E E E 所在的桶中的全部键值。
2)前一问题中,如果换成线性散列索引,其余假设不变,同时假设只有当插入新键值后空间利用率大于 80% 时才增加新的桶,则全部键值按序插入完成后该散列索引中共有几个桶?并请写出键值 B B B 所在的桶中的全部键值(包括溢出块中的键值)。

【解】
(1)
在这里插入图片描述

在这里插入图片描述
(2)

在这里插入图片描述

在这里插入图片描述

(3)
对于 B+ 树,假设有以下的参数:
在这里插入图片描述
假设所有磁盘块都不在内存中。现在我们考虑一种压缩 B+ 树,即对 B+ 树的节点键值进行压缩存储。假设每个节点中的键值压缩 1 倍,即每个节点在满的情况下可压缩存储 2 n 2n 2n
压缩前的键值和 2 n + 1 2n+1 2n+1 个指针。额外代价是记录读入内存后必须解压,设每个压缩键值的内存解压时间为 c c c。给定 N N N 条记录,现使用压缩 B+ 树进行索引,请问在一棵满的 n n n 阶压缩 B+ 树中查找给定记录地址的时间是多少?(使用表格中的参数表示, n + 1 n+1 n1 n − 1 n−1 n1 可近似表示为 n n n

【解】

设该棵满的 n n n 阶压缩 B+ 树的层数为 k k k,则叶子节点的数目为 ( 2 n + 1 ) k − 1 (2n + 1)^{k−1} (2n+1)k1
每个叶子节点满的时候存放 2 n 2n 2n 个键值,则所有叶子节点存放 ( 2 n + 1 ) k − 1 × 2 n (2n + 1)^{k−1}×2n (2n+1)k1×2n 个键值
只有叶子节点存放数据,则 ( 2 n + 1 ) k − 1 × 2 n = N (2n + 1)^{k−1}×2n = N (2n+1)k1×2n=N,可得 k ≈ l o g 2 n N k ≈ log_{2n}N klog2nN
读取一个节点到内存的时间为 R + S + T R + S + T R+S+T
每个节点的解压时间为 2 n c 2nc 2nc,在每个节点中查找到目标记录的时间为 2 n 2n 2n
则查找给定记录地址的时间为 ( R + S + T + 2 n c + 2 n ) × l o g 2 n N (R + S + T + 2nc + 2n) × log_{2n}N (R+S+T+2nc+2n)×log2nN

Homework #4

1. 关系模式中 T(U)、S(U) 和属性 V 值的估计

已知有关系模式 R ( A , B , C ) R(A, B, C) R(A,B,C) S ( B , C , D ) S(B, C, D) S(B,C,D),每个属性都占 10 个字节,请估计下面的逻辑查询计划的 T ( U ) , S ( U ) T(U), S(U) T(U),S(U) 以及结果关系中每个属性的 V V V 值(假设满足“Containment of Value Sets”,并且选择条件中的值都在关系中存在):

在这里插入图片描述

【解】

在这里插入图片描述

2. 改进的两阶段归并排序算法

在这里插入图片描述

【解】

在这里插入图片描述

在这里插入图片描述

3. 多趟归并排序算法

在这里插入图片描述

【解】

在这里插入图片描述

在这里插入图片描述

Homework #5

1. 嵌套事务

目前许多 DBMS 例如 MySQL 都默认不支持嵌套事务(即在一个事务内部又开始另一个事
务),请分析一下:如果 DBMS 支持嵌套事务,将面临哪些问题(至少写出 2 点以上并且要给出自己的分析)?

【解】

在这里插入图片描述

2. 支持检查点的日志记录与数据库系统恢复过程

下面是一个数据库系统开始运行后的日志记录,该数据库系统支持检查点。

在这里插入图片描述
设日志修改记录的格式为 < T i d , V a r i a b l e , N e w   v a l u e , O l d   v a l u e > <Tid, Variable, New\ value, Old\ value> <Tid,Variable,New value,Old value>,请给出对于题中所示①、②、③三种故障情形下,数据库系统恢复的过程以及数据元素 A , B , C , D , E , F A, B, C, D, E, F A,B,C,D,E,F G G G 在执行了恢复过程后的值。

【提示】

  • 第一步,找出 redo、undo 的事务。有 commit 的是 redo,没有 commit 的是 undo。
  • 第二步,按事务先 undo,恢复为旧值;再 redo,恢复为新值。

【解】

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 冲突可串和视图可串

下表给出了 4 个事务的一个调度序列,请回答问题:

在这里插入图片描述

(1) 画出该调度的优先图,并判断该调度是否冲突可串。如果回答“是”,请给出冲突等价的串行调度序列;如果回答“不是”,请解释理由。
(2) 画出该调度的多重图,并判断该调度是否视图可串。如果回答“是”,请给出视图等价的串行调度序列;如果回答“不是”,请解释理由。

在这里插入图片描述

【解】

(1)
在这里插入图片描述

优先图无环,是冲突可串,T4->T1->T2->T3 是一个冲突等价的串行调度序列。

(2)

在这里插入图片描述

删除紫色标记 X 的两条边,得到的无环图是视图可串,T4->T1->T2->T3 是一个视图等价的串行调度序列。

4. 冲突可串调度证明

证明:如果一个并发调度 S S S 中的所有事务都遵循 2 P L 2PL 2PL,则该调度必定是冲突可串调度。

【提示】

两阶段锁 2 P L 2PL 2PL,分为两个阶段,图似爬楼梯再下楼梯。

  • 第一阶段,称为获得锁阶段。事务要读变量 A , B A, B A,B,就要先获得 A , B A, B A,B 的锁,获得锁阶段锁的数量从 0 逐渐增加至最大。
  • 第二阶段,称为释放锁阶段。使用完变量后,再释放锁,当释放任何一个锁后无法再获得锁,释放锁阶段锁的数量从最大逐渐减小至 0。

【证明】

在这里插入图片描述

举报

相关推荐

0 条评论