Postgres博士的说明:
虽然访问存储在物化视图中的数据通常比直接或通过视图访问底层表快得多,但数据并不总是最新的;
https://www.postgresql.org/docs/9.6/rules-materializedviews.html
为什么“常常要快得多?”
发布于 2019-02-25 13:47:34
MV的数据存储在一个普通的表中,这是没有魔力的。但由于多种可能的原因,访问速度通常要快得多:
简而言之:对底层表的复杂查询的最昂贵的工作已经完成,这可能允许更快的访问。
发布于 2019-02-25 13:52:19
物化视图帮助您预先计算数据.如果您没有正确使用该工具,那么使用它们可能会慢一些。
下面是一个示例:
test=> create table my_table
(id integer generated always as identity,
time timestamptz);
CREATE TABLE ^
test=> alter table my_table add constraint pk_my_table primary key (id);
ALTER TABLE
test=> insert into my_table (time)
test-> (select time_series
test(> from generate_series('2019-02-25','2019-03-25', '1 minutes'::interval) as time_series);
INSERT 0 40321
^
test=> explain analyze select * from my_table where time between now() and now() + '1 minute'::interval;
QUERY PLAN
------------------------------------------------------------------------------------------------------
Seq Scan on my_table (cost=0.00..1125.22 rows=2 width=12) (actual time=0.093..4.642 rows=1 loops=1)
Filter: (("time" >= now()) AND ("time" <= (now() + '00:01:00'::interval)))
Rows Removed by Filter: 40320
Planning Time: 0.132 ms
Execution Time: 4.657 ms
(5 rows)
test=> create materialized view my_materialized_view as
test-> (select * from my_table);
SELECT 40321
test=> explain analyze select * from my_materialized_view where time between now() and now() + '1 minute'::interval;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
Seq Scan on my_materialized_view (cost=0.00..1218.62 rows=222 width=12) (actual time=0.859..28.983 rows=1 loops=1)
Filter: (("time" >= now()) AND ("time" <= (now() + '00:01:00'::interval)))
Rows Removed by Filter: 40320
Planning Time: 0.352 ms
Execution Time: 29.053 ms
(5 rows)如果您的物化视图设计不当(或者不是针对特定查询的设计),或者如果您没有足够的数据,则可以使用物化视图来进行更慢的查询。
https://dba.stackexchange.com/questions/230665
复制相似问题