CIKM 2012 WIZARD
Published:
A New Tool for Multi-Level Partitioning in Teradata. CIKM. 2012.
整体思想
本质上是大分区和小分区的权衡,这篇文章的思想比较简单,通过不同列 Range 的 Split 和 Merge 最终得到一个最优化的分区方案。由于这篇文章比较老,其实近几年已有一些更为先进的基于学习的分区推荐工作。可参考:(1)浅谈 Query-driven partitioning: Qd-tree, PAW, Jigsaw(2)Automatic/Query-driven Partitioning in Industry。
WIZARD Overview
1 Preprocessing
预处理阶段是从查询集合里提取过滤表达式的 Range,并做一个简单的 Transformation。举例,如果两个 Query 的过滤表达式都针对列 $a$ 有一个 Range 过滤的操作,但是 Range 是重叠的,就需要拆分成不重叠的 Range。
2 Initial
初始阶段:
- 从$M$中获取$q$对应的 range 集合$L$,例如 q1 的 L = {R[1,1], R[1,2], R[2,1], R[2,2]}
- 查看$L$是否包含$rp$的任一个 range
- 如果包含,则查询其 Scan Cost,称为$s$,其步骤如下:
- $L$复制到$L’$
- $L’$内合并$rp$涉及的 range
- 根据$L’$还原谓词表达式,称为$C$
- 构建 Scan 查询,例如SELECT * FROM F WHERE C,调EXPLAIN加权得到 $s$
- 若不包含,则直接使用$q$之前的 Scan Cost
3 Optimized
若 Partition 数量超过 Limit 需要进一步合并
同时这里需要考虑,分区很多的话 IO 也会升高,分区很少(但是分区大)的话也会导致很多无用 Scan。
这篇文章很简单,不想写笔记了。