Postgres數據庫中的視圖和物化視圖

摘自:http://www.cnblogs.com/yjf512/p/4402096.htmlhtml

 

postgres中的視圖在查詢的時候進行掃描子表的操做,而物化視圖則是實實在在地將數據存成一張表。物化視圖是在9.3 以後纔有的東西。sql

 

建立一個視圖數據庫

CREATE OR REPLACE VIEW student_view ASSELECT  *
   FROM student
   LEFT JOIN teacher 
   ON student.teacher_id = teacher.id;

 

建立一個物化視圖post

CREATE MATERIALIZED VIEW student_view_m ASSELECT  *
   FROM student
   LEFT JOIN teacher 
   ON student.teacher_id = teacher.id;

 

student_view去每一個表中進行查詢,而student_view_m 直接去視圖表查詢,而物化視圖的查詢效率確確實實高於視圖很多。
 
物化視圖的數據填充:

物化視圖既然是一個實實在在存在的表,它就須要有數據填充過程,數據填充的命令是REFRESH MATERIALIZED VIEWspa

master=> \h REFRESH Command: REFRESH MATERIALIZED VIEW Description: replace the contents of a materialized view Syntax: REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ]

這裏有個注意的,若是你的psql是9.3的,那麼你查看幫助文檔就只會看到:code

master=> \h REFRESH Command: REFRESH MATERIALIZED VIEW Description: replace the contents of a materialized view Syntax: REFRESH MATERIALIZED VIEW name [ WITH [ NO ] DATA ]

這裏就引入說postgres的更新數據庫有兩種方式,一種是全量更新,一種是增量更新,增量更新是在REFRESH的時候增長一個CONCURRENTLY參數。而增量更新是9.4才加入的操做。htm

那麼哪一種更新快呢?答案是全量更新,增量更新作的操做是將當前視圖表中的數據和query中的數據作一個join操做,而後纔將差量作填充。blog

可是全量更新會阻塞select操做,就是說,你全量更新的過程當中,全部對視圖的select操做都會被阻塞,而增量更新卻不會這樣。
 
物化視圖適合的場景應該是對數據的實時性要求不高的場景。
相關文章
相關標籤/搜索