CMU 15445 9. 排序和聚合算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMU 15445 9. 排序和聚合算法相关的知识,希望对你有一定的参考价值。
参考技术A 我们需要排序,因为在关系模型中,表中的元组没有特定的顺序排序,但可能在ORDER BY,GROUP BY,JOIN和DISTINCT运算符中使用。我们可以通过从左到右扫描叶子节点来使用群集B +树加速排序。 但是,如果我们使用非聚集B +树进行排序,这是一个坏主意,因为它会导致大量I / O读取(通过指针追踪随机访问)。
如果我们需要排序的数据适合内存,那么我们可以使用标准排序算法,如quicksort。 如果数据不合适,我们需要使用能够根据需要溢出到磁盘的外部排序。
外部排序 分为2个部分。首先在内存里排序部分data然后写入磁盘。 随后把小块的文件合并成一个排完序的大文件。
第1个pass:把每B个 PAGES(B 取决于buffer pool 支持的最大page 数量)读到内存。排序,随后把他们写回磁盘。每一个排序的page组称为一个run
之后的pass:递归的合并每一对run,成为下一个run。每一次都会少掉一般的run。
读完b个page之后,对这整个page做排序。
随后在合并的时候,n/b 个大page要merge
在合并的时候,我们可以用b-1个来并发。因为还要留一个page去写。
所以有上图公式。
还有一些情况可以不用外部排序,比如说是聚集的b+树索引。我们可以简单去遍历树的叶子节点来做聚合。但是非聚集的索引就不方便。
一般聚合函数又sum,count,min,max等。
实现聚合的主要手段又2种。一种是排序,一种是hash
首先对GROUP BY键上的元组进行排序。 如果内存足够,则放入缓冲池,使用内存排序算法(例如,快速排序)
如果数据大小超过内存,外部合并排序算法。
然后,DBMS对已排序的数据执行顺序扫描以计算聚合。 operator的输出将按key排序。
散列计算聚合比排序计算聚合更高效。 DBMS在扫描表时填充哈希表。 对于每条记录,检查哈希表中是否已有条目并执行适当的修改。
如果哈希表的大小太大而无法容纳在内存中,那么DBMS必须将其溢出到磁盘:
在ReHash阶段,DBMS可以存储表单对(GroupByKey→RunningValue)来计算聚合。 RunningValue的内容取决于聚合函数。 要将新元组插入哈希表:
•如果我们找到匹配的GroupByKey,只需适当更新RunningValue。
•否则插入新的(GroupByKey→RunningValue)对。
以上是关于CMU 15445 9. 排序和聚合算法的主要内容,如果未能解决你的问题,请参考以下文章
CMU Database Systems - Sorting,Aggregation,Join
CMU15-445 PROJECT #1 - BUFFER POOL(实验代码,已满分)
CMU15-445 PROJECT #1 - BUFFER POOL(Fall2020实验代码,已满分)