物化视图维护的代数方法
为了保证与数据源的一致性,当数据源发生变化时,物化视图需要进行及时的更新。很多时候,数据源的变化相比于整体而言是较小的。此时使用增量更新的方式来对物化视图进行维护会更加高效。本文主要介绍维护物化视图的代数方法。这些方法可能在某些算子上无法提供最高效的维护方法,但在语义上比较直观。
研究历史
对物化视图维护的研究最早可追溯到1980年代。这些早期的工作都局限在特定的数据库模型上。[1] 对函数式关联数据模型 (functional association data model) 上的视图维护方法进行了研究。而 [2] 只支持无环数据库 (acyclic database) 上的视图。这些视图先将数据表中所有关系表进行自然连接,之后进行映射;无法支持选择操作,也无法对部分表进行连接。
[3] 是第一个对一般物化视图的维护进行研究的工作,他们的方法可以对包含选择、映射和连接等操作在内的视图进行维护。[4] 则进一步提出使用代数方法 (algebraic method) 来描述物化视图维护的方法。在代数方法中,输入表R的更新被描述为一对增量表:∇R和ΔR。其中∇R表示R中被删除的记录,而ΔR表示R中新插入的记录。我们使用一组等式来描述这些变化是如何在算子之间传播的。在 [4] 中,作者提供了集合代数 (set algebraic) 上选择、映射、笛卡尔积、并、差、交和内连接等算子的变化传播方程 (change propagation equation)。[5] 则给出了包代数 (bag algebraic) 上相关算子的变化传播方程。
[6] 为包含外连接的视图提供了维护方法,但他们的方法并不是基于代数形式的。[7] 给出了描述维护半连接和外连接视图的代数方法。[8] 给出了基于change table方法对外连接视图进行更新的方法,但他们的方法显然是错误的。
相较于其他算子,聚合算子的变化传播很难通过代数形式进行描述。首先,聚合算子本身的代数描述就比困难。其次,部分聚合操作(如 median)并不满足分配律 (distributive property),因此无法很难描述输出变化和输入变化之间的关系。 [5] 给出了聚合算子的变化传播方程,但他们的聚合算子无法支持分组语句 (group-by),并且只能作为视图中最后一个算子。[8] 通过通用映射 (general projection) 来对聚合操作进行描述,给出了一般情况下可分配的聚合算子的变化传播方程。除此之外,其他在维护聚合视图上的工作 [10, 11],都只描述了具体的过程,而没有给出形式化描述。
在维护视图的代数方法中,如果我们向后传播的插入和删除中存在重叠的记录,那么显然会导致后面的增量更新存在不必要的冗余计算。我们希望向下游传播的变化是最小化的,即ΔR∩∇R=∅。[4] 虽然给出了常见算子的变化传播方法并号称这些方法满足最小化条件,但实际并非如此。[12] 指出了 [4] 中的错误,并给出了一个通用的构建最小化结果变化的方法。
虽然代数方法可以用于解决一般情况下的视图更新问题,但在实际中我们的视图通常会多个嵌套的算子。此时使用代数方法去逐个算子逐个输入的去计算视图的变化效率会非常低。此时,我们常常需要一些更加高效但没有那么纯粹 (pure) 的方法来计算视图的更新 [9]。
视图更新的代数方法
选择 (Select)
选择算子的变化传播方程如下
σp(R∪ΔR)=σp(R)+σp(ΔR)
σp(R−∇R)=σp(R)−σp(∇R)
映射 (Project)
映射算子的变化传播方程如下
πA(R∪ΔR)=πA(R)∪πA(ΔR)
πA(R−∇R)=πA(R)−πA(∇R)
并 (Union)
集合代数和包代数下并操作有着不同的语义。我们使用UNION
和UNION ALL
来区分这两种不同的操作。
UNION ALL
我们使用R∪S来表示表R和S在包语义下的并操作。如果一个记录t在R中出现了n次,在S中出现了m次。如果n>0或者m>0,那么t inR∪S,并且在R∪S中出现n+m次。
UNION ALL
的变化传播方程如下
(R−∇R)∪S=(R∪S)−∇R
(R∪ΔR)∪S=(R∪S)∪ΔR
UNION
我们使用R⊔S表示表R和S在集合语义下的并操作。如果一个记录t在R出现了或者在S中出现了,那么t也会出现在R⊔S中,并且只出现一次。
当R中某个记录r被删除时,对于R⊔S可能存在以下两种情况
- 如果r在R−∇R或者S中出现了,那么r仍然会在最终的结果中出现。r的删除并不会对最终的结果产生任何影响。
- 如果r既没有出现在R−∇R中,也没有出现在S中,那么从R中删除r之后,r也会从最终的结果中被删除。我们使用∇R⊖((R−∇R)⊔S) 来表示∇R中没有出现在R−∇R和S中的记录。
根据上面的讨论可知:
(R−∇R)⊔S=(R⊔S)−(∇R⊖((R−∇R)⊔S))
当R中添加某个记录r时,对于R⊔S可能存在以下两种情况
- 如果r已经在R或者S中出现了,那么r已经在最终的结果中出现了。插入r并不会对最终的结果产生任何影响。
- 如果r既没有出现在R中,也没有出现在S中,那么r就需要添加到最终的结果中。我们使用ΔR⊖(R⊔S)来表示ΔR中既没有出现在R也没有出现在S中的记录。
根据上面的讨论可知
(R∪ΔR)⊔S=(R⊔S)∪(ΔR⊖(R⊔S))
交 (Intersect)
和并操作一样,交操作需要区分集合语义和包语义。我们使用INTERSECT ALL
表示包语义下的并操作,INTERSECT
表示集合语义下的并操作。
INTERSECT ALL
我们使用R∩S表示表R和S在包语义下的交操作。如果一个记录t在R中出现了n次,在S中出现了m次,并且n>0,m>0,那么t∈R∩S,并在R∩S中出现min(n,m)次。
当R中删除一个记录r时
- 如果n>m,那么在删除掉r不会对最终的结果产生影响。
- 如果n≤m,那么在删除掉r之后,应该在最终的结果中减少一次r的出现。
根据上面的讨论可知
(R−∇R)∩S=(R∩S)−(∇R−(R−S))
当R中插入一个记录r时
- 如果n≥m,那么在添加r时不会对最终的结果产生影响。
- 如果n<m,那么在添加r后,应该在最终的结果中增加一次r的出现。
根据上面的讨论可知
(R∪ΔR)∩S=(R∩S)∪(ΔR∩(S−R))
INTERSECT
我们使用R⊓S表示表R和S在集合语义下的交操作。如果一个记录t在R中出现了,在S中也出现了,那么t∈R⊓S,并在R⊓S中出现一次。
参考UNION
的讨论方式,可得INTERSECT
的变化传播方程为
(R−∇R)⊓S=(R⊓S)−(∇R⊓(S⊖(R−∇R)))
(R∪ΔR)⊓S=(R⊓S)∪(ΔR⊓(S⊖R)))
差 (Minus)
和并操作一样,差操作需要区分集合语义和包语义。我们使用MINUS ALL
表示包语义下的差操作,MINUS
表示集合语义下的差操作。
MINUS ALL
MINUS ALL
按照包语义执行差操作。我们使用R−S表示表R和S在包语义下的差操作。如果一个记录t在R中出现了n次,在S中出现了m次,并且n>m,那么t∈R−S,并且在R−S中出现n−m次。
MINUS ALL
的变化传播方程如下
(R−∇R)−S=(R−S)−∇R
(R∪ΔR)−S=(R−S)∪ΔR
MINUS
MINUS
按照集合语义执行差操作。我们使用R⊖S表示表R和S在集合语义下的差操作。如果一个记录t在R中出现了,但在S中没有出现,那么t∈R⊖S,并且在R⊖S只出现一次。
当我们从R中删除一个记录r时
- 如果r没有在S中出现,那么r应该会出现在原来的结果中。
- 如果r也没有在R−∇R中出现,那么将r从R中删除之后,r就需要从最终的结果中删除掉。
- 如果r出现在R−∇R中,那么将r从R中删除之后,并不会对最终的结果产生任何影响。
- 如果r出现在S中,那么r本来就不存在于原来的结果中。删除r并不会对最终的结果产生任何影响。
根据上面的讨论可知,当r既没有出现在S中也没有出现在R−∇R中时,删除r会导致r从最终的结果中删除。因此
(R−∇R)⊖S=(R⊖S)−(∇R⊖((R−∇R)⊔S))
当我们向R中插入一个新记录r时
- 如果r已经出现在S中了,那么r不会出现在原来的结果中,插入r也不会导致最终结果的变化。
- 如果r没有在S中出现
- 如果r已经出现在R中了,那么插入r也不会导致最终结果的变化。
- 如果r没有出现在R中,那么插入r后r会出现在最终结果中。
根据上面的讨论可知,当r既没有出现在S也没有出现在R中时,插入r会导致r添加到最终的结果中。因此
(R∪ΔR)⊖S=(R⊖S)∪(ΔR⊖(R⊔S))
类似的,我们对S插入或删除的情况进行讨论,可得
R⊖(S−∇S)=(R⊖S)∪(∇S⊓(R⊖(S−∇S)))
R⊖(S∪ΔS)=(R⊖S)−(ΔS⊓(R⊖S))
内连接 (Inner Join)
我们用R⋈pS表示表R和表S按照连接条件p进行的连接操作。
内连接的变化传播方程如下
(R−∇R)⋈pS=(R⋈pS)−(∇R⋈pS)
(R∪ΔR)⋈pS=(R⋈pS)∪(ΔR⋈pS)
左外连接 (Left Outer Join)
我们使用R⟕pS表示表R和S按照条件p进行的左外连接操作。左外连接R⟕pS除了返回R⋈S之外,还会将R中无法和S进行连接的记录用null补齐S中的字段返回。即
R⟕pS=(R⋈pS)∪((Rˉ⋉S)×dS)
其中dS 是一个和S的字段一致并且所有列都为null的记录。
当R中某个记录r被删除时
- 如果在表S中存在s使得p(r,s)成立,那么(r,s)出现在原来的结果中,此时我们需要将(r,s)从最终的结果中删除。
- 如果在表S中不存在s使得p(r,s)成立,那么(r,dS) 出现在原来的结果中。此时我们需要将(r,dS)从最终的结果中删除。
根据上面的讨论可知
(R−∇R)⟕pS=(R⟕pS)−(∇R⟕pS)
当R中添加某个记录r时
- 如果在表S中存在s使得p(r,s)成立,那么(r,s)会出现在最终的结果中。
- 如果在表S中不存在s使得p(r,s)成立,那么(r,dS)会出现在最终的结果中。
根据上面的讨论可知
(R∪ΔR)⟕pS=(R⟕pS)∪(ΔR⟕pS)
类似的,我们对S插入或删除的情况进行讨论,可得
R⟕p(S−∇S)=((R⟕pS)−(R⋈p∇S))∪(((R⋉p∇S)ˉ⋉p(S−∇S))×dS)
R⟕p(S∪ΔS)=((R⟕pS)∪(R⋈pΔS))−(((R⋉pΔS)ˉ⋉pS)×dS)
全外连接 (Full Outer Join)
我们使用R⟗pS表示表R和S按照条件p进行的全外连接操作。全外连接R⟗pS除了返回R⋈S之外,还会将R中无法和S进行连接的记录用null补齐S中的字段返回,将S中无法和R进行连接的记录用null补齐R中的字段后返回。即
R⟗pS=(R⋈pS)∪((Rˉ⋉S)×dS)∪((Sˉ⋉R)×dR)
其中dS 是一个和S的字段一致并且所有列都为null的记录,dR是一个和R的字段一致并且所有列都为null的记录。
和左外连接的情况类似,我们可得
(R−∇R)⟗pS=((R⟗pS)−(∇R⟕pS))∪(((S⋉p∇R)ˉ⋉p(R−∇R))×dR)
(R∪ΔR)⟗pS=((R⟗pS)∪(ΔR⟕pS))−(((S⋉pΔR)ˉ⋉pR)×dR)
半连接 (Semi Join)
我们使用R⋉pS表示表R和S按照条件p进行的半连接操作。半连接R⋉pS返回R中和S可以按照连接条件p进行连接的记录,即
R⋉pS=r|r∈R,∃s∈S,p(r,s)
当R中某个记录r被删除时
- 如果在表S中存在s使得p(r,s)成立,那么r出现在原来的结果中。此时我们需要将r从最终的结果中删除。
- 如果在表S中不存在s使得p(r,s)成立,那么r没有出现在原来的结果中,因此也就不会对最终的结果产生影响。
根据上面的讨论可知
(R−∇R)⋉pS=(R⋉pS)−(∇R⋉pS)
当R中添加某个记录r时
- 如果在表S中存在s使得p(r,s)成立,那么r会出现在最终的结果中。
- 如果在表S中不存在s使得p(r,s)成立,那么r不会出现在最终的结果中。
根据上面的讨论可知
(R∪ΔR)⋉pS=(R⋉pS)∪(ΔR⋉pS)
类似的,我们对S插入或删除的情况进行讨论,可得
R⋉p(S−∇S)=(R⋉pS)−((R⋉p∇S)ˉ⋉p(S−∇S))
R⋉p(S∪ΔS)=(R⋉pS)∪((R⋉pΔS)ˉ⋉pS))
反半连接 (Anti Semi Join)
我们使用Rˉ⋉pS表示表R和S按照条件p进行的反半连接操作。反半连接Rˉ⋉pS返回R中可以和S按照连接条件p进行连接的记录,即
Rˉ⋉pS=r|r∈R,∄s∈S,p(r,s)
和半连接的情况类似,我们可得
(R−∇R)ˉ⋉pS=(Rˉ⋉pS)−(∇Rˉ⋉pS)
(R∪ΔR)ˉ⋉pS=(Rˉ⋉pS)∪(ΔRˉ⋉pS)
Rˉ⋉p(S−∇S)=(Rˉ⋉pS)∪((R⋉p∇S)ˉ⋉p(S−∇S))
Rˉ⋉p(S∪ΔS)=(Rˉ⋉pS)−(R⋉pΔS)
Related Work
[1] S. Koenig et al. A transformational framework for the automatic control of derived data. In VLDB 1981, pp. 306-318.
[2] O. Shmueli et al. Maintenance of views. In SIGMOD 1984, pp. 240-255.
[3] J. Blakeley et al. Efficiently updating materialied views. In SIGMOD 1986, pp. 61-71.
[4] X. Qian et al. Incremental recomputation of active relational expressions. In TKDE 1991 vol. 3(3) pp. 337-341.
[5] T. Griffin et al. Incremental maintenance of views with duplicates. In SIGMOD 1995, pp. 328-339.
[6] A. Gupta et al. Maintenance and self-maintenance of outerjoin views. In Next Generation Information Technology and Systems 1997.
[7] T. Griffin et al. Algebraic change propagation for semijoin and outerjoin queries. In SIGMOD Record 1998 vol. 27(3), pp. 22-27.
[8] H. Gupta et al. Incremental maintenance of aggregate and outerjoin expressions. In Information Systems 2006, vol. 31(6), pp. 435-464.
[9] P. Larson et al. Efficient maintenance of materialized outer-join views. In ICDE 2007, pp. 56-65.
[10] I. Mumick et al. Maintenance of data cubes and summary tables in a warehouse. In SIGMOD Record 1997, vol. 26(2), pp.100-111.
[11] T. Palpanas et al. Incremental maintenance for non-distributive aggregate functions. In VLDB 2002, pp. 802-813.
[12] T. Griffin et al. An improved algorithm for the incremental recomputation of active relational expressions. In TKDE 1997, vol. 9(3) pp. 508-511.