这篇论文是Hyper数据库关于高效执行window functions的论文。window function是SQL:2003标准中的语法,TPC-DS中99条sql有9条使用。它可以让sql表达得更为灵活,有了window function,一些以前需要用复杂的子查询来表达的sql变得可以用window function来表达。
概念
window function有几个概念可以对应到语法中:
- partition,先按partition key做分组
- order by,对分组中的行按order key做排序
- frame,计算每一行对应的frame的范围
- evaluation 计算frame中的agg函数
partition和sort的执行方式:
- hash-based的方法,先对partition key做hash,再独立sort
- sort-based,直接对partition key和sort-key做sort
并行执行:
- inter-partition 每个partition之间并行。在partition数目比较多且数据比较均匀的情况下,并行较优。
- intra-partition 针对数据倾斜标记严重的数据或者partition数目比较少的数据需要对partition内做并行 intra-partition的并行之所以可以做,是因为partition中的每一条tuple都需要算自己的frame,以及其agg函数。
agg函数的执行:
- naive agg:
对于每一条tuple都耿直地找frame执行一遍agg。会有平方级的计算。 - cumulative agg:
适用于range between unbound preceding and current row的一直增长的frame计算(想像下累计sum计算) - removable cumulative agg:
适用于于非一直增长的的between x preceding and y following,(想像下sum计算, 减去x前面一个对应的值再加上y对应的值) - segment tree agg: (有利于并行)
先构建线段树,加速后续Sum的计算。适用于动态的frame计算。
不同Agg执行方式时间复杂度
上面的时间复杂度没有考虑(intra-partition)并行,如果考虑并行的话Segment Tree会是更好的选择,因为Cumulative Agg和Removable Cumulative Agg计算依赖的状态不能并行构建,而Segment Tree可以并行构建。