湖北洈水水利水电建设公司网站,做公司网站用哪个空间好,衡阳企业网站建设,南昌城市旅游网站建设Photon Hash Aggregation Vectorization
Photon Hash Join 的向量化的要点是#xff1a;使用开放地址法。步骤#xff1a;
向量化计算 hash 值基于 hash 向量化计算 bucket 下标#xff0c;得到 bucket index 向量基于 bucket index 向量中记录的下标找到 bucket#xff…Photon Hash Aggregation Vectorization
Photon Hash Join 的向量化的要点是使用开放地址法。步骤
向量化计算 hash 值基于 hash 向量化计算 bucket 下标得到 bucket index 向量基于 bucket index 向量中记录的下标找到 bucket判定是否冲突如果冲突则继续向下直至找到正确 bucket将正确 bucket 下标回填到 bucket index 向量中 Not So Vectorized。下图中绿色就是解决冲突后找到的 bucket 位置。 4. 向量化计算 Aggregate 值。伪代码如下 可以看到上面几个步骤里除了 3 里面有一些不规整的操作其余都是非常简单的 kernel 操作。
Photon 关于 Null 的考虑
Photon 测试发现为了处理 Null会付出 23% 的开销。基于如下观察
用户很少专门给列加上 Not Null 约束很多场景里虽然没有指明 Not Null 约束但实际数据中 Null 很少
所以Photo 给每一个 batch 的数据都附带了一个 has_nulls() 标记如果这一批数据里面一个 null 都没有那么这一批数据的计算就可以使用 NotNullKernel性能最佳反之就回退到使用 WithNullKernel付出必要的代价。 注意这里要强调 Batch而不是全量数据。全量数据里有少许 Null但其中大部分 Batch 里没有 Null就能用上上述优化。
Photon 关于 Selector / Active Rows 考虑
考虑到存在 Filter并且 Filter 可能会过滤掉大部分数据Photon 为过滤后的数据创建了一个 Active Rows 结构用于索引未被过滤的数据。 增加 Active Rows 概念后后继所有数据访问都要通过 Active Rows 索引来定位成为框架固有开销。
另一种实现思路是引入 Skip 数组当行过滤时Skip[i] 被设置为 1否则为 0。访问过滤后的数据时需要遍历整个 skip 数组。这么做的好处是…内存好管理缺点是增加了不必要的判断。