让我们假设有一个设计,其中每个表都由一个视图表示,即简单地选择表的所有列和所有行。
--vw
Select * From sys_table
然后运行一个查询
Select * From vw Where some_column = some_value
数据库将首先在视图中执行查询,将表的所有数据选择到内存中,就像我独立运行查询一样,然后它会运行具有where语句的实际查询吗?
我之所以想知道这是因为我试图了解视图是如何工作的,并想知道数据库是否进行了优化,比如组合查询,以确保不必将全部数据加载到内存中。
发布于 2020-07-24 08:26:35
视图只是存储的查询,当您从视图中选择时,数据库运行与视图关联的查询。
如果您运行explain (analyze)
并检查执行计划,您可以很容易地看到这一点。
假设下表和视图:
create table data (id integer primary key, some_date date, some_number numeric);
create view v_data as select * from data;
当我跑步时:
explain analyze
select *
from v_data
where id = 42;
我得到以下执行计划:
Index Scan using data_pkey on data (cost=0.15..8.17 rows=1 width=40) (actual time=0.006..0.006 rows=1 loops=1)
Index Cond: (id = 42)
Planning Time: 0.104 ms
Execution Time: 0.023 ms
如您所见,视图的名称甚至没有显示在计划中。
有关潜在性能陷阱的更多见解,请参见视图对PostgreSQL中的性能是否有害?
https://dba.stackexchange.com/questions/271591
复制