【问题标题】:are views that query from other views also refreshed automatically从其他视图查询的视图是否也自动刷新
【发布时间】:2023-01-12 10:02:56
【问题描述】:

假设我有一个从另一个视图查询的视图:

create view another_view as (select * from my_table);

create view one_view as (select * from another_view);

select * from one_view;

当我发出最后一条语句 select * from one_view; 时,它是否也刷新并查询 another_view ?

【问题讨论】:

    标签: sql oracle sql-view


    【解决方案1】:

    视图不会在任何地方持久化,因此无法“刷新”。当您从视图中查询时,SQL 引擎将重写查询以使用视图的查询并直接从应用视图中的所有连接、过滤器等的基础表中进行选择。


    鉴于设置:

    CREATE TABLE my_table (value) AS
    SELECT 1 FROM DUAL;
    
    create view another_view as (select * from my_table);
    
    create view one_view as (select * from another_view);
    

    然后你可以看看从视图中选择的解释计划:

    EXPLAIN PLAN FOR
    select * from one_view;
    

    然后:

    SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
    

    哪些输出:

    PLAN_TABLE_OUTPUT
    Plan hash value: 3804444429
     
    ------------------------------------------------------------------------------
    | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |          |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| MY_TABLE |     1 |     3 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    

    Oracle 不从任何视图中选择,它重写查询以直接从基础表中选择。因此,没有视图必须“刷新”的概念;它始终是表中当前的任何内容。

    fiddle

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多