在这种情况下使用物化视图还是普通视图?

时间:2014-08-28 21:11:52

标签: sql oracle view oracle11g materialized-views

基于某些研究,似乎AGGREGATION无法在物化视图中使用FAST FRESH

我发现oracle document个状态Complex Materialized View无法快速刷新。

In some cases, an aggregate function, although it is possible to have an aggregate 
function in the defining query and still have a simple materialized view.
For example, the following statement creates a complex materialized view:

CREATE MATERIALIZED VIEW hr.average_sal AS
SELECT AVG(salary) "Average" FROM hr.employees@orc1.example.com;

我创建的物化视图包含多个连接结果的SUM()聚合(6个六个连接应该返回一些8 thousand行)。视图应每20秒刷新一次。 这是脚本

CREATE MATERIALIZED VIEW V_MVIEW$BASEVIEW
BUILD IMMEDIATE
REFRESH FAST START WITH (sysdate) NEXT (sysdate+1*20/(60*60*24)) WITH PRIMARY KEY
AS
    select 
        cb.id as cb_id,
        vb.id as vb_id,
        sb.id as sb_id,
        v.id as v_id, v.name as v_name,
        t.t1 as t1, t.t2 as t2, t.t3 as t3,
        c.id,
        SUM(t.amount) as t_amount

        from t
            join cb on t.cb_id = cb.id
            join vb on cb.vb_id = vb.id
            join sb on sb.id = vb.sb_id
            join v on v.id = sb.v_id
            join c on c.id=cb.c_id

        GROUP BY 
            cb.id, 
            vb.id, 
            sb.id, 
            v.id, v.name, 
            t.t1, t.t2, t.t3, 
            c.id
            ;

由于上述限制,我不太确定使用物化视图仍然是有益的,因为每20秒刷新整个视图可能不比普通视图好吗?我该如何优化这种情况?

1 个答案:

答案 0 :(得分:0)

根据我的经验,物化视图用于接收服务器在主机系统不可用时不能没有数据的情况。我同意上面的评论,每20秒刷新一次似乎过多,但如果这就是数据的作用,那就是数据的作用。

例如,假设我们有一个订单输入系统和一个库存控制系统。库存控制系统维护库存状态(良好,过期,损坏等)。订单输入系统需要知道订单需要多少好的库存。这对于物化视图来说是个好例子,因为库存状态信息对订单输入过程至关重要。没有它,订单输入系统将无法接受订单,因为它无法检查状态。

然而,在另一边。假设相同的订单输入系统生成库存报告,其中包括配送中心的库存和订单中的库存。配送中心不知道订单,所以我们只是同意订单输入系统是生成此报告的正确位置。如果我们无法生成报告,经理可能抱怨,但不会停止业务。这对于跨dblink的标准视图来说是个好例子。数据的使用并不重要,因此如果库存控制系统由于某种原因而停机,这不是什么大问题,因为订单输入系统可以稍后运行报告。

很抱歉,如果我没有真正回答你的问题,但希望它能给你一些思考。