物化视图更新算法(三):Aggregation的优化

540 阅读3分钟

基本算法

在1中我们提到了一个物化视图更新的基本框架,就是根据change propogation function来推导出视图VV的更新。2中给出了在这个框架下更新aggregation的算法:

Untitled.png

并且推导出了一个满足strong minimality的更新算法:

Untitled 1.png

这里有我们假设一定包含有count这个聚合函数,如果没有则添加一个。其中使用到的一些符号如下:

- \atop \ltimes: semi join

GB(A)GB(A): group by的attributes

Aggregation Change Table的优化

上面提到的方法虽然比较通用,但是在某些条件下还是会产生不必要的查询或者状态的维护。3中提出了一个基于change table的优化方法。我们先以如下的例子来举例:

CREATE VIEW SISales AS
SELECT storeID, itemID, sum(price) AS SumSISales, count(∗) AS NumSISales FROM sales
WHERE date > 1/1/95
GROUP BY storeID, itemID;

CREATE MATERIALIZED VIEW CitySales AS
SELECT city, sum(SumSISales) AS SumCiSales, sum(NumSISales) AS NumCiSales FROM SISales, stores
WHERE SISales.storeID = stores.storeID
GROUP BY city;

CREATE MATERIALIZED VIEW CategorySales AS
SELECT category, sum(SumSISales) AS SumCaSales, sum(NumSISales) AS NumCaSales FROM SISales, items
WHERE SISales.itemID = items.itemID
GROUP BY category;

上面的图示view的关系可以用下图来表示:

Untitled 2.png

如上面的SQL所示,当sales这个表有数据插入时,如果我们按照2中提到的方法,变更只能是Insert/Deletion的话,那么更新过程如下所示:

Untitled 3.png

可以看出,为了产生SIsales的更新,我们需要重新查下sales表,或者维护一个SIsales的物化视图。这2种都会产生一定的代价,要么增加维护时的查询成本,要么会增加存储成本。

3中提到了一种Change Table的方法,即我们的变更不仅包含InsertDelete,还可以增加一种Change Table,这样能在某些情况下减少查询。如上面的例子如果使用Change Table则可以减少掉中间aggregation的查询操作。

Untitled 4.png

一些定义

Aggregation Change Table并不是在所有情况下都能产生的,而是需要通过一个aggregation才能产生出来。我们假设VV是一个定义在某个SPJSPJ上的aggregation,这个aggregation用πG,B=f(A)(R)\pi_{G,B=f(A)}(R)来表示,其中RR表示SPJSPJ的view。当RR产生Insert/Deletion的时候,VV所产生的Aggregation Change Table如下:

V=πG,f(A),Count=sum(_count)(ΠG,A,_count=1(R)(ΠG,N(A),_count=1(R))\Box V = \pi_{G, f(A), Count = sum(\_count)}(\Pi_{G, A, \_count=1}(\triangle R) \uplus (\Pi_{G, N(A), \_count=-1}(\triangledown R))

其中NN根据aggregation算法的不同定义如下:

Untitled 5.png

VV的更新算法如下:

New(V)=VθUVNew(V) = V \sqcup_{\theta}^{U} \Box V

其中我们把θU\sqcup_{\theta}^{U}称为refresh operator 。其中θ\theta是两个join条件J1,J2\mathcal{J_1}, \mathcal{J_2}UU是一系列的update函数U=<(Ai1,f1),(Ai2,f2),,(Aik,fk)>U=<(A_{i_1}, f_1), (A_{i_2}, f_2), \ldots, (A_{i_k}, f_k)>,其中每个fif_iVVV\Box V中对应属性的函数。refresh算子算法如下:

  1. V\Box V中某个tuple与VV中因为J1\mathcal{J_1}匹配上时,我们按照UU来更新
  2. V\Box V中某个tuple与VV中因为J2\mathcal{J_2}匹配上时,删除此tuple
  3. 否则新增此tuple

并且我们定义G=gG(LHS.g=RHS.g)\equiv_{G} = \bigwedge_{g\in G}(LHS.g = RHS.g)AttrAttr定义某个表达式的属性集,比如Attr(G)Attr(G)表示GG中的所有属性。

我们以上一段中的CategorySales表为例,来展示一下上述一些定义:

Untitled 6.png

Aggregate-refresh operatorrefresh operator的一种特例,是如果一个refresh operatorθU\sqcup_{\theta}^{U}满足如下条件则可以成为aggregate-refresh operator:

  1. J1,J2\mathcal{J_1}, \mathcal{J_2}可以分别表示为:
    1. J1:(Gp1)\mathcal{J_1}:(\equiv_G \wedge p_1)
    2. J2:G¬p1\mathcal{J_2}: \equiv_G \wedge \neg p_1
  2. GAttrs(U)=G \bigcap Attrs(U) = \empty

Change Propogation

有了上面的定义之后,我们可以根据2中的框架得到下图中的change propogation公式。

Untitled 7.png

3中对上述公式给予了证明:当第3列是aggregation refresh operator的时候,上述公式成立且第四列也是aggregation refresh operator

上表中我们看到并不是所有的关系代数运算符都被包含了进去,所以当不支持的关系代数运算符存在时,我们退回到2中提到的原始框架即可。

参考文献

  1. 物化视图更新算法(一):基础框架
  2. Quass, Dallan. "Maintenance expressions for views with aggregation." (1996).
  3. Gupta, Himanshu, and Inderpal Singh Mumick. "Incremental maintenance of aggregate and outerjoin expressions." Information Systems 31.6 (2006): 435-464.