使用物理视图与主表空

时间:2017-09-11 05:28:37

标签: oracle materialized-views

我正在使用Oracle中物化视图的概念执行一些测试而我无法回答这个问题,当物理视图最初创建的主表变为空时,物化视图是否会获取行?我在下面列出了一系列事件,以便想象我的想法,

  1. 根据庞大的主表创建有效的物化视图
  2. 这是一个例子

    主表

    CREATE TABLE master_tab
    (                    
    col1 varchar2(10),         
    col2 varchar2(10), 
    col3 varchar2(10),
    tr_val1 number,
    tr_val2 number,
    tr_val3 number
    )
    

    物化视图定义

    CREATE MATERIALIZED VIEW mview_test
    BUILD IMMEDIATE 
    REFRESH COMPLETE
    ON DEMAND 
    ENABLE QUERY REWRITE
    AS SELECT col1, col2
    SUM(tr_val1), SUM(tr_val2)
    FROM master_tab
    GROUP BY col1, col2
    
    1. 稍后,由于某种原因,主表master_tab被截断
    2. 因此,现在,只有物化视图具有与主表master_tab上的任何查询相关的任何数据
    3. 我不太熟悉Oracle在后台获取正确数据的工作。现在,从查找主表中的数据的应用程序执行查询时会发生什么?例如,当应用程序查询时会发生什么,

      SELECT col1, col2
      SUM(tr_val1), SUM(tr_val2)
      FROM master_tab
      GROUP BY col1, col2
      
      1. Oracle在内部采取什么样的决策来从物化视图中获取数据?
      2. 即使Master表为空,Oracle仍会从物化视图中检索正确的数据吗?
      3. 如果对#2的回答是肯定的,那是否意味着只要不再次刷新实体化视图,Oracle仍然可以为从主服务器查找数据的所有查询获取数据?
      4. 感谢您的帮助

1 个答案:

答案 0 :(得分:2)

试着回答你的问题:

  1. 要使用查询重写并从MV获取数据,请检查以下内容:a)启用查询重写(会话)b)启用查询重写(MV)和c)重写完整性检查(I认为这是你需要控制的地方)
  2. 以上除了检查SQL本身是否可以使用MV重写(您可以在SQL上使用 batchPlaceBetSubscription:Subject<string>=new Subject(); batchPlaceBetSubscription:Observable<Response>; sendToServer(ID: string): Observable<any> { this.batchPlaceBetSubscription.next(ID); return this.batchPlaceBetSubscription$; } private placeBetBatchRequests(placeBetItem: IplaceBet[]) { this.batchPlaceBetSubscription$ = this.batchPlaceBetSubscription .buffer(Observable.timer(0, 3000)) .take(1) .switchMap(IDsArray => { debugger; return this.http.post('http://someURL,IDsArray) .map(res => res.json()) .catch(e => Observable.throw(e)) }) } 来建议是否可以重写以及使用哪个MV

    1. 完整性级别DBMS_MVIEW.EXPLAIN_REWRITE用于查看是否允许使用查询重写。默认值为QUERY_RESRITE_INTEGRITY,可以是ENFORCEDTRUSTED。在您的情况下,如果是STALE_TOLERATEDTRUSTED,则仍会重写查询,并且将从MV检索数据

    2. 我相信是的,给定2