问题现象
参数 one-pass hash group 的适用场景。
处理方法
one-pass hash group 适用于源表行数较多(相对于 group buffer),且 group by 列 中不同值占比较多的情况。当前实现中包含三种划分方式:RR、原始 hash、one-p ass hash,它们的评估原则如下:
采样得到的 DistinctRatio < 10(不同值占比小于 10%)时,使用 RR 划分(需 要二次聚集),否则使用 hash 划分。预期第一次聚集的结果集比较小,二次 聚集代价较低。
根据源表的行数和 group buffer 的大小,确定使用原始的 hash 划分,还是 onepass hash 划分:
1. 当 group buffer 能够容纳源表数据的 50%时,使用原始的 hash 划分。这时 会将数据分为 dop 份,每个线程一份,预期各线程进行聚集时不会发生多 趟;
2. 否则使用 one-pass hash 划分,这时会将数据分为(原始数据行数 / 子线 程哈希表能够容纳的行数 * 4)个文件分片。(乘以 4 是为了防止一个文件 分片聚集时发生多趟)。
说明 如果数据量相对于 group buffer 较大,而采样结果显示不同值较多,就会使用 one-pass has h 划分。
问题 2
参数 one-pass hash group 的算法选择。
回答
针对特定的数据,以下两个原因可能导致算法选择上不是最优:
数据量大时,采样结果不准确;
选择原始 hash group 或 one-pass hash group 时,只参考了数据量,没有考虑数 据特征。