oracle 从其他视图查询的视图是否也会自动刷新

brgchamk  于 2023-01-12  发布在  Oracle
关注(0)|答案(1)|浏览(316)

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

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

ldxq2e6h

ldxq2e6h1#

视图不会在任何位置持久化,因此无法"刷新"。从视图查询时,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

相关问题