首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >物化视图性能

物化视图性能
EN

Database Administration用户
提问于 2019-02-25 13:34:46
回答 2查看 11.7K关注 0票数 4

Postgres博士的说明:

虽然访问存储在物化视图中的数据通常比直接或通过视图访问底层表快得多,但数据并不总是最新的;

https://www.postgresql.org/docs/9.6/rules-materializedviews.html

为什么“常常要快得多?”

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-02-25 13:47:34

MV的数据存储在一个普通的表中,这是没有魔力的。但由于多种可能的原因,访问速度通常要快得多:

  • 已连接的多个表
  • 较小的行大小,只有用于常见查询的相关列
  • 预计算值
  • 预选行,可能以昂贵的方式进行。
  • 可能会少得多(更少的死元组)
  • 与基础表相比,上述项目中的多个可能导致表的大小更小。
  • 行的物理排序是有利的(群集),因此查询只需读取少数数据页。
  • 索引的大小可以相应地小得多。
  • 有些类型的索引可能会变成这样,就像多个基础表的列上的多个索引一样。

简而言之:对底层表的复杂查询的最昂贵的工作已经完成,这可能允许更快的访问。

票数 12
EN

Database Administration用户

发布于 2019-02-25 13:52:19

物化视图帮助您预先计算数据.如果您没有正确使用该工具,那么使用它们可能会慢一些。

下面是一个示例:

代码语言:javascript
复制
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)

如果您的物化视图设计不当(或者不是针对特定查询的设计),或者如果您没有足够的数据,则可以使用物化视图来进行更慢的查询。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/230665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档