基于其他视图创建的视图,查询时是否会自动刷新并访问底层视图?
依赖视图的查询执行逻辑说明
首先直接给你答案:是的,当你执行select * from one_view;时,数据库会实时执行another_view的定义逻辑,最终从底层的my_table获取最新数据。
这里得先搞清楚普通视图的本质:它并不是一个存储数据的实体表,更像是一个“保存起来的查询语句模板”。每次你查询视图的时候,数据库不会去读取某个预先存储的视图内容,而是会重新执行视图定义里的SQL语句,从它依赖的对象(表或者其他视图)里实时拉取最新数据。
结合你的代码例子具体拆解下执行流程:
- 当你执行
select * from one_view;,数据库首先会解析one_view的定义,发现它要从another_view取数据 - 接着数据库会继续解析
another_view的定义,发现它的数据源是my_table - 最终数据库会把这两层视图的查询逻辑合并成一条等价的SQL:
select * from my_table,直接执行这条语句返回结果
简单说,普通视图没有“刷新”这一说,因为它本身不存数据——每次查询都是实时走一遍依赖链,拿到最新的底层数据。要是你用的是物化视图(Materialized View),那才需要手动刷新来同步底层数据,但你这里创建的是普通视图,完全是实时计算的。
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

