物化视图更新算法(二):Join

222 阅读1分钟

物化视图中join是一种很常见的,本文中我们讨论下 join的优化。

Inner Join

在1中我们提到物化视图更新算法框架下我们需要找出对一个表达式的更新算法。这里我们使用\triangle表示一个物化视图的更新,即包含增加,也包含删除。同时我们使用AA表示更新之前的状态,AA'表示更新之后的状态。如果我们在更新物化视图时只能拿到base table事务之前的状态,那么更新表达式为:

(ABC)=(ABC)(ABC)(ABC)(ABC)(ABC)(ABC)(ABC)\triangle(A \Join B \Join C) = (\triangle A \Join B \Join C) \newline \uplus (\triangle A \Join \triangle B \Join C) \newline \uplus (\triangle A \Join \triangle B \Join \triangle C) \newline \uplus (\triangle A \Join \triangle B \Join \triangle C) \newline \uplus (A \Join \triangle B \Join \triangle C) \newline \uplus (A \Join B \Join \triangle C) \newline \uplus (A \Join \triangle B \Join C)

可以看出,当有nn个表时,这个表达式有2n12^n - 1项。

如果在更新物化视图时能拿到base table之后的状态,则表达式可以简化为:

(ABC)=(ABC)(ABC)(ABC)\triangle (A \Join B \Join C) = \newline (\triangle A \Join B' \Join C') \newline \uplus (A \Join \triangle B \Join C') \newline \uplus (A \Join B \Join \triangle C)

由于\triangle通常比较小,因此在实现中通常采用lookup join的方式,甚至会为了加速构建索引。

Outer Join

Outer join的优化则比较复杂,其基本思路是按照5中提到的将outer join转化为disjunction后再优化, 这里不在详述。

参考文献

  1. 物化视图更新算法(一):基础框架
  2. Witkowski, Andrew, et al. "Continuous queries in oracle." Proceedings of the 33rd international conference on Very large data bases. 2007
  3. Gupta, Ashish, Inderpal Singh Mumick, and Venkatramanan Siva Subrahmanian. "Maintaining views incrementally." ACM SIGMOD Record 22.2 (1993): 157-166
  4. Larson, Per-Ake, and Jingren Zhou. "Efficient maintenance of materialized outer-join views." 2007 IEEE 23rd International Conference on Data Engineering. IEEE, 2007.
  5. Galindo-Legaria, César A. "Outerjoins as disjunctions." Proceedings of the 1994 ACM SIGMOD international conference on Management of data. 1994