天天看點

postgres中的視圖和物化視圖視圖和物化視圖差別比較下視圖和物化視圖的性能物化視圖的資料填充物化視圖适合什麼

postgres中的視圖和mysql中的視圖是一樣的,在查詢的時候進行掃描子表的操作,而物化視圖則是實實在在地将資料存成一張表。說說版本,物化視圖是在9.3 之後才有的邏輯。

建立兩個表

建立一個視圖

建立一個物化視圖

進行查詢explain:

可以看出,student_view去每個表中進行查詢,而student_view_m 直接去視圖表查詢,而物化視圖的查詢效率确确實實高于視圖不少。

物化視圖既然是一個實實在在存在的表,它就需要有資料填充過程,資料填充的指令是refresh materialized view

這裡有個注意的,如果你的psql是9.3的,那麼你檢視幫助文檔就隻會看到:

這裡就引入說postgres的更新資料庫有兩種方式,一種是全量更新,一種是增量更新,增量更新是在refresh的時候增加一個concurrently參數。而增量更新是9.4才加入的操作。

那麼哪種更新快呢?答案是全量更新,增量更新做的操作是将目前視圖表中的資料和query中的資料做一個join操作,然後才将差量做填充。

但是全量更新會阻塞select操作,就是說,你全量更新的過程中,所有對視圖的select操作都會被阻塞,而增量更新卻不會這樣。

物化視圖适合的場景應該是對資料的實時性要求不高的場景。

我的項目中遇到的情況是提出問題,立刻就要在問題表中看到我提出的問題,雖然可以做觸發器來當insert的時候觸發增量更新,但是,當資料量大的時候,增量更新的速度确實不能承受。是以,在這種情況下,還是放棄物化視圖,從索引方面多考慮考慮。

繼續閱讀