CMU《数据库系统导论》(2019) by Andy Pavlo Lesson 9&10
作者 AlexFisher
1.b树并发算法
科普:latch与lock的区别:latch针对内存中的数据结构,而lock针对事务处理
蟹行协议:
写操作:
从上到下遍历树时,用写锁锁住可能被修改的节点。如果一个节点安全则其上方所有节点的锁都可被解锁。
读操作:
从上到下遍历树时,用共享锁(读锁)锁住当前节点。获取到下一个节点后立刻释放该节点的锁。
注意点:
写操作释放锁集合时从上往下释放,提升效率。
如果不像b-link树那样对非叶子节点也有左右兄弟指针的话,可以考虑最后只锁住最上方的不安全节点以及叶子节点(防止其他叶子节点访问该叶子节点)。
改进1:乐观尝试
由于写锁独占节点十分影响性能,因此在遍历树时可以对非叶子节点乐观的使用读锁,如果发现目标叶子节点不安全则再重新使用写锁从头执行。
改进2:延迟写更新
感觉Andy这一块没有讲的清楚,具体实现没有明白。大体思路是延迟对父节点的更新以避免发现目标节点不安全时重新用写锁遍历:对父节点的更新使用全局的表来设置标志,让之后访问父节点的操作代为执行写操作。后面如果查到相关资料会再更新。
改进3:B-link Tree
这里不细展开,B-link树通过给每个非叶子节点增加右兄弟节点指针的方式,实现了自下向上加写锁的可行性。
sql sort实现
1.分治思想处理无序数据
对于乱序数据可以使用归并排序来减少IO次数。假设数据库分配得到的内存支持同时最多持有B个页面,那么同时可以对至多B-1个页面进行同一个归并排序(剩下一个页面存放输出内容)。
2.使用B+树索引进行天然排序
如果要排序的索引是主索引,那么就直接用主索引找所有数据,且这些数据在磁盘上顺序存放,因此IO速度也很快。
如果要排序的索引不是主索引,那么额外的IO以及IO速度就会大大降低。并且可能会导致页面的重复存取。(在同一个页上存储的元组 对应的key值相差较大,导致该页可能被重复调入调出内存)
sql aggregation实现(group by/distinct/sum等)
过滤器总是在查询最开始就被执行。这样可以省去很多查询时要用的空间。
hash aggregation
为查询建立(一个或多个)临时的哈希表。
例:哈希表的键为group by的key,值为sum
哈希表过大的解决方法:
使用哈希1对数据进行分组,使得具有相同键的元组一定落在同一个分组内。
分组完成后对每个分组依次进行操作:
使用哈希2对分组内的数据再次哈希,区分出相同键的元组,将它们的数值聚合,然后放入到一个新的哈希表中并输出。
如果数据库最多可以保持B个页面存放在内存中,则分组数量至多为B-1个。剩下一个用于输入元组。
tips:
Andy认为实现一个模块时,应该先实现一个简单并正确的版本,确认它可以正确满足基本需求后再在此基础上作出改进。
例:先设计一个支持单线程的简单B+树索引,测试其增删查功能后再在此基础上尝试各种优化、增加它的并行性。