视图不会在任何地方持久化,因此无法“刷新”。当您从视图中查询时,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