物化視圖類似於視圖,允許使用者儲存經常使用的或複雜的查詢。物化視圖有實際的物理儲存,但不支援直接寫入更新資料。在查詢中引用物化視圖時,資料直接從物化視圖返回。物化視圖的資料不會自動重新整理,因此可能不是最新的,但是訪問物化視圖中的資料要比直接或通過視圖訪問底層表中的資料快得多。物化視圖在使用者能夠容忍定期更新資料的情況下擁有巨大的效能優勢。
AnalyticDB PostgreSQL版Serverless版本暫不支援物化視圖功能。
建立物化視圖
使用命令CREATE MATERIALIZED VIEW建立一個查詢的物化視圖。
CREATE MATERIALIZED VIEW my_materialized_view as
SELECT * FROM people WHERE age > 40
DISTRIBUTED BY (id);
SELECT * from my_materialized_view ORDER BY age;返回資訊如下:
id | name | city | age
------------+------------+------------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
(3 rows)物化視圖定義中的查詢僅用於填充物化視圖。物化視圖定義和普通表的定義一樣(除了不能指定OID)。DISTRIBUTED BY在建立時可選,若沒有該語句會選擇預設的第一個可分區列進行分區。
物化視圖會忽略儲存在物化視圖中的ORDER BY以及SORT操作。
重新整理或禁用物化視圖
使用REFRESH MATERIALIZED VIEW命令重新整理物化視圖資料。
INSERT INTO people VALUES('007','sunshen','shenzhen',60);
SELECT * from my_materialized_view ORDER BY age;返回資訊如下:
id | name | city | age
------------+------------+------------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
(3 rows) REFRESH MATERIALIZED VIEW my_materialized_view;
SELECT * from my_materialized_view ORDER BY age;返回資訊如下:
id | name | city | age
------------+------------+------------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
007 | sunshen | shenzhen | 60
(4 rows)使用With NO DATA子句會刪除當前資料且不產生新資料,還會使物化視圖處於無法掃描狀態。如果試圖查詢無法掃描狀態的物化視圖,將返回一個錯誤。
REFRESH MATERIALIZED VIEW my_materialized_view With NO DATA;
SELECT * from my_materialized_view ORDER BY age;
ERROR: materialized view "my_materialized_view" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
REFRESH MATERIALIZED VIEW my_materialized_view;
SELECT * from my_materialized_view ORDER BY age;返回資訊如下:
id | name | city | age
------------+------------+------------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
007 | sunshen | shenzhen | 60
(4 rows)刪除物化視圖
使用DROP MATERIALIZED VIEW命令刪除一個物化視圖。
CREATE MATERIALIZED VIEW depend_materialized_view as
SELECT * FROM my_materialized_view WHERE age > 50
DISTRIBUTED BY (id);
DROP MATERIALIZED VIEW depend_materialized_view;使用DROP MATERIALIZED VIEW ... CASCADE命令還會刪除所有依賴該物化視圖的對象。例如,如果另一個物化視圖依賴於即將被刪除的物化視圖,那麼另一個物化視圖也將被刪除。
如果沒有CASCADE選項,DROP MATERIALIZED VIEW命令就會失敗。
CREATE MATERIALIZED VIEW depend_materialized_view as
SELECT * FROM my_materialized_view WHERE age > 50
DISTRIBUTED BY (id);
DROP MATERIALIZED VIEW my_materialized_view;
ERROR: cannot drop materialized view my_materialized_view because other objects depend on it
DETAIL: materialized view depend_materialized_view depends on materialized view my_materialized_view
HINT: Use DROP ... CASCADE to drop the dependent objects too.
DROP MATERIALIZED VIEW my_materialized_view CASCADE;適用情境
可以容忍資料不是最新或者定期手動更新的情境。
經常使用的或者特別複雜的查詢。
物化視圖結合外部資料源(如OSS外表、MaxCompute外表)可以實現更快的查詢分析。外部資料通過物化視圖實現本機存放區,同時也可以對物化視圖建立索引。