CIKM 2012 WIZARD

less than 1 minute read

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

初始阶段:

  1. 从$M$中获取$q$对应的 range 集合$L$,例如 q1 的 L = {R[1,1], R[1,2], R[2,1], R[2,2]}
  2. 查看$L$是否包含$rp$的任一个 range
  3. 如果包含,则查询其 Scan Cost,称为$s$,其步骤如下:
    • $L$复制到$L’$
    • $L’$内合并$rp$涉及的 range
    • 根据$L’$还原谓词表达式,称为$C$
    • 构建 Scan 查询,例如SELECT * FROM F WHERE C,调EXPLAIN加权得到 $s$
  4. 若不包含,则直接使用$q$之前的 Scan Cost

3 Optimized

若 Partition 数量超过 Limit 需要进一步合并

同时这里需要考虑,分区很多的话 IO 也会升高,分区很少(但是分区大)的话也会导致很多无用 Scan。

这篇文章很简单,不想写笔记了。