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/7200≈8.3ms,则平均旋转延迟时间为
8.3
m
s
/
2
≈
4.2
m
s
8.3ms/2≈4.2ms
8.3ms/2≈4.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.002ms≈9.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.3ms≈2.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(x−1)≤8192,可求,
x
≤
19.1
x \le 19.1
x≤19.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 中同时包含给定关键词
的文献”,关键词可以是一个,也可以是多个。请回答下面问题(假设所有文献都是英文文
献):
- 假如在 title 上创建了 B + t r e e B+tree B+tree 索引,能不能提高此查询的效率(须解释理由)?
- 由于文献 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
n+1 或
n
−
1
n−1
n−1 可近似表示为
n
n
n)
【解】
设该棵满的
n
n
n 阶压缩 B+ 树的层数为
k
k
k,则叶子节点的数目为
(
2
n
+
1
)
k
−
1
(2n + 1)^{k−1}
(2n+1)k−1
每个叶子节点满的时候存放
2
n
2n
2n 个键值,则所有叶子节点存放
(
2
n
+
1
)
k
−
1
×
2
n
(2n + 1)^{k−1}×2n
(2n+1)k−1×2n 个键值
只有叶子节点存放数据,则
(
2
n
+
1
)
k
−
1
×
2
n
=
N
(2n + 1)^{k−1}×2n = N
(2n+1)k−1×2n=N,可得
k
≈
l
o
g
2
n
N
k ≈ log_{2n}N
k≈log2nN
读取一个节点到内存的时间为
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。
【证明】