首页 文章

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

提问于
浏览
0

根据一些研究,似乎 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

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

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

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

    对不起,如果我没有真正回答你的问题,但希望它给你一些思考的东西 .

相关问题