上一篇文章中我们描述了SPJG的物化视图的改写,其中的J只能是inner join。本文中我们将描述outer join的物化视图的改写。与inner join不同,我们不能将其简单地视为笛卡尔积的问题,而是需要一些复杂的变换。
这里我们对后面要用到的符号和定义做一些总结。
$null-rejecting$: 当一个selection条件$p$所引用的任意列是$null$,则$p$肯定不为$true$,这是我们说$p$是$null-rejecting$。
$null(T)$: 当某一行在表$T$的列上全是$null$,则$null(T)$为真。比如$T_1 \rtimes T_2$的结果中,当$T_1$中的某行$t_1$在$T_2$中没有找到任何匹配的行时,我们需要对$T_2$所对应的列填充$null$,那么对这一行$null(T_2)$ 就是 $true$。如果 $\Tau = \{T_1, T_2, \ldots, T_n\}$,那么$null(\Tau) = null(T_1) \land null(T_2) \ldots null(T_n)$,$\overline{null}(\Tau) = \text{\textasciitilde} null(T_1) \land \text{\textasciitilde}null(T_2) \ldots \land \text{\textasciitilde}null(T_n)$。
$\uplus (outer\ union)$: 假设表$T_1$的schema是$S_1$,表$T_2$的schema是$S_2$,那么$T_1 \uplus T_2$首先null extend$T_1$和$T_2$是他们的schema是$S_1 \cup S_2$,然后做一个union all的操作。例如,假设$T_1$的schema和数据如下:
| int | float |
|---|---|
| 1 | 1.1 |
| 2 | 2.2 |
$T_2$的schema和数据如下:
| double | int |
|---|---|
| 3.3 | 3 |
| 4.4 | 4 |
那么$T_1 \uplus T_2$的schema和数据如下:
| int | float | double | int |
|---|---|---|---|
| 1 | 1.1 | null | null |
| 2 | 2.2 | null | null |
| null | null | 3.3 | 3 |
| null | null | 4.4 | 4 |
$subsume$: $t_1$ $subsume$ $t_2$指的是$t_1$和$t_2$有相同的schema,$t_1$中的$null$少于$t_2$,并且$t_2$中的某个值不是$null$,则$t_1$中对应的值也不是$null$;而对于$t_2$中的非$null$值,$t_1$中包含相同的值。例如,$t_1$是$(1,2,null)$,$t_2$是$(null, 2, null)$,则我们认为$t_1\ subsume\ t_2$。
$T\downarrow$: 如果表$T$中的某个tuple被另一个tuple $subsume$了,则去除所有这样的tuple得到的结果。
$T_1 \oplus T_2(minimum\ union): T_1 \oplus T_2 = (T_1 \uplus T_2)\downarrow$
$Q_1 \subset_s Q_2(subsume\ contained)$: $Q_1 \subset_s Q_2\ if\ \forall t_1 \in Q_1, \exists t_2 \in Q_2, t_1 = t_2\ or\ t_2\ subsumes\ t_1$
这里我们首先介绍几个变换规则:

任何一个SPOJ的表达式,如果所有的表都满足$T_i = T_i\downarrow$,并且所有的selection条件都是$null-rejecting$的情况下,我们可以将其转化成join-disjunctive 的形式,即: