注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

Waiting for PostgreSQL9.3:增加物化视图 (MATERIALIZED VIEW)  

2013-03-05 16:42:39|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        今天在访问 depesz 博客时,发现了一个令人兴奋的消息,在未来的 PostgreSQL 9.3
版本中将带来物化视图,很多 PostgreSQL 爱好者对这个功能期待已久,闲话少说,先体验
一下。

物化视图创建语法
 Command:     CREATE MATERIALIZED VIEW
Description: define a new materialized view
Syntax:
CREATE [ UNLOGGED ] MATERIALIZED VIEW table_name
    [ (column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    AS query
    [ WITH [ NO ] DATA ]
   
    
一 创建物化视图
--1.1 创建测试表
 francs=# select version();
                                                 version                                                  
----------------------------------------------------------------------------------------------------------
 PostgreSQL 9.3devel on i686-pc-linux-gnu, compiled by gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3), 32-bit
(1 row)

francs=> create table test_1 (id int4,name character varying(32));
CREATE TABLE
    
francs=> insert into test_1 select generate_series(1,10),generate_series(1,10)||'a';
INSERT 0 10

francs=> select * from test_1;
 id | name 
----+------
  1 | 1a
  2 | 2a
  3 | 3a
  4 | 4a
  5 | 5a
  6 | 6a
  7 | 7a
  8 | 8a
  9 | 9a
 10 | 10a
(10 rows)
   

--1,2 创建普通视图和物化视图
 francs=> create view v_test_1 as select * from test_1 where pg_sleep(5) is null;
CREATE VIEW

francs=> create materialized view mv_test_1 as select * from test_1 where id > 5;
SELECT 5
   

--1.3 查看PLAN
 francs=> explain analyze select * From v_test_1;
                                             QUERY PLAN                                             
----------------------------------------------------------------------------------------------------
 Seq Scan on test_1  (cost=0.00..18.75 rows=233 width=86) (actual time=0.032..0.041 rows=5 loops=1)
   Filter: (id > 5)
   Rows Removed by Filter: 5
 Total runtime: 0.153 ms
(4 rows)

francs=> explain analyze select * from mv_test_1;
                                              QUERY PLAN                                               
-------------------------------------------------------------------------------------------------------
 Seq Scan on mv_test_1  (cost=0.00..17.00 rows=700 width=86) (actual time=0.222..0.231 rows=5 loops=1)
 Total runtime: 0.296 ms
(2 rows)
     备注:上面看出访问普通视图时,依然是访问基表; 而访问物化视图时,不需要访问基表,而是直接从物化
               视图读数据。

--1.4 查看大小
 francs=> \dm+
                           List of relations
 Schema |   Name    |       Type        | Owner  | Size  | Description 
--------+-----------+-------------------+--------+-------+-------------
 francs | mv_test_1 | materialized view | francs | 16 kB | 
(1 row)

francs=> \dv+
                     List of relations
 Schema |   Name   | Type | Owner  |  Size   | Description 
--------+----------+------+--------+---------+-------------
 francs | v_test_1 | view | francs | 0 bytes | 
(1 row)

     备注: \dm 元子命令显示物化视图大小,mv_test_1 大小为 16 k,这也说明了物化视图
              直接存储数据。


二 刷新物化视图
--2.1 物化视图刷新语法
 francs=> \h refresh materialized view 
Command:     REFRESH MATERIALIZED VIEW
Description: replace the contents of a materialized view
Syntax:
REFRESH MATERIALIZED VIEW name
    [ WITH [ NO ] DATA ]
   

--2.2 刷新前
 francs=> select * from mv_test_1;
 id | name 
----+------
  6 | 6a
  7 | 7a
  8 | 8a
  9 | 9a
 10 | 10a
(5 rows)

francs=> delete from test_1 where id=10;
DELETE 1

francs=> select * from mv_test_1;
 id | name 
----+------
  6 | 6a
  7 | 7a
  8 | 8a
  9 | 9a
 10 | 10a
(5 rows)
   

--2.3 刷新物化视图
 francs=> refresh materialized view mv_test_1 ;
REFRESH MATERIALIZED VIEW
 

--2.4 再次查看物化视图
 francs=> select * from mv_test_1;
 id | name 
----+------
  6 | 6a
  7 | 7a
  8 | 8a
  9 | 9a
(4 rows)
 

--2.5 "WITH NO DATE" 刷新模式
 francs=> refresh materialized view mv_test_1 with no data;
REFRESH MATERIALIZED VIEW

francs=> select * from mv_test_1;
ERROR:  materialized view "mv_test_1" has not been populated
HINT:  Use the REFRESH MATERIALIZED VIEW command.

francs=> \dm+ mv_test_1 
                            List of relations
 Schema |   Name    |       Type        | Owner  |  Size   | Description 
--------+-----------+-------------------+--------+---------+-------------
 francs | mv_test_1 | materialized view | francs | 0 bytes | 
(1 row)
   备注:刷新物化视图时有两种模式,"WITH DATA" 模式表示重新加载数据到物化视图,命令执行后物化视图
             可以访问;而"WITH NO DATE" 模式表示不刷新物化视图,命令执行之后物化视图不可访问。

三 总结:
   1 以上只是 PostgreSQL 9.3 deve 版目前提供的功能,可能之后会有较大改变。
     
   2 目前物化视图功能并不完善,例如自动刷新,增量刷新,跨库刷新等功能暂不支持,期待后续功能完善。
         
   
四 参考
http://www.postgresql.org/docs/devel/static/sql-creatematerializedview.html
http://www.postgresql.org/docs/devel/static/sql-refreshmaterializedview.html
http://blog.163.com/digoal@126/blog/static/16387704020132581138434/?newFollowBlog
http://www.depesz.com/2013/03/04/waiting-for-9-3-add-a-materialized-view-relations/comment-page-1/#comment-37694   
  
  评论这张
 
阅读(12337)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016