創建物化視圖
本文介紹如何創建物化視圖。
權限要求
創建視圖需要有數據庫或表級別的CREATE權限。
刷新物化視圖需要有數據庫或表級別的INSERT權限。
需要有物化視圖所涉及的所有表的相關列(或整個表)的SELECT權限。
如果在創建物化視圖時指定物化視圖為自動刷新模式,需要具備通過服務器本地(即
127.0.0.1
)或者任意IP(即'%'
)刷新視圖的權限。
語法
CREATE [OR REPLACE] MATERIALIZED VIEW <mv_name>
[MV DEFINITION]
[REFRESH [COMPLETE|FAST] [ON [DEMAND |OVERWRITE] [START WITH date] [NEXT date]]]
[QUERY REWRITE]
AS
<QUERY BODY>;
關鍵字說明
說明 | |
| 根據是否存在重名物化視圖選擇對應的規則來創建物化視圖,具體規則如下:
說明 集群版本為3.1.4.7或以上的AnalyticDB for MySQL集群才支持該參數。
|
| 物化視圖名稱。 |
| 定義物化視圖中表相關的特性。
|
| 定義物化視圖的刷新模式為全量刷新。 未指定物化視圖的刷新模式時,默認刷新模式為全量刷新。 |
| 定義物化視圖的刷新模式為增量刷新。 說明 3.1.9.0及以上版本支持單表增量刷新物化視圖;3.2.0.0及以上版本支持多表增量刷新物化視圖。詳情請參見增量刷新物化視圖(預發)。
|
| 按需觸發刷新,即您可以在需要刷新物化視圖時手動觸發刷新,或根據刷新需求配置 默認全量刷新觸發模式為 |
| 物化視圖引用的基表在執行 配置 |
| 定義自動全量刷新物化視圖時的首次刷新時間。參數選填,若不填,默認首次刷新時間為當前時間點。 說明 支持使用時間函數,但只支持精確到秒,毫秒部分會被截斷。 更多關于刷新物化視圖的詳情,請參見全量刷新物化視圖。 |
| 定義自動全量刷新物化視圖時的下次刷新時間。若需要設置自動刷新, 說明 支持使用時間函數,但只支持精確到秒,毫秒部分會被截斷。 更多關于刷新物化視圖的詳情,請參見全量刷新物化視圖。 |
| 開啟或關閉查詢改寫功能。開啟后查詢可被自動改寫到物化視圖上,物化視圖可以被當作緩存使用。取值如下:
|
| 定義物化視圖的查詢主體,查詢主體可以是表、邏輯視圖或者物化視圖。其中:
|
使用限制
不支持對物化視圖執行
INSERT
、DELETE
或UPDATE
操作。不支持刪除或重命名物化視圖中引用的基表或基表中的列。如需修改基表需要先刪除物化視圖。
默認情況下,一個AnalyticDB for MySQL集群支持創建的物化視圖上限如下:
集群版本低于3.1.4.7:最多支持創建8個物化視圖。
集群版本等于或高于3.1.4.7:最多支持創建64個物化視圖。
說明查看企業版或湖倉版集群的內核版本,請執行
SELECT adb_version();
。如需升級內核版本,請聯系技術支持。
示例
創建物化視圖
myview1
,每五分鐘刷新一次。CREATE MATERIALIZED VIEW myview1 REFRESH NEXT now() + interval 5 minute AS SELECT count(*) as cnt FROM base;
創建物化視圖
myview2
,每周一凌晨2點刷新。CREATE MATERIALIZED VIEW myview2 REFRESH START WITH DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + interval 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
創建物化視圖
myview3
,每天凌晨2點刷新。CREATE MATERIALIZED VIEW myview3 REFRESH START WITH DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + interval 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
創建物化視圖
myview4
,每個月第一天凌晨2點刷新。CREATE MATERIALIZED VIEW myview4 REFRESH NEXT DATE_FORMAT(last_day(now()) + interval 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM base;
創建物化視圖
myview5
,只刷一次。CREATE MATERIALIZED VIEW myview5 REFRESH START WITH now() + interval 1 day AS SELECT count(*) as cnt FROM base;
創建物化視圖
myview6
,不自動刷新,完全依靠手動刷新。CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (id) ) DISTRIBUTED BY HASH (id) AS SELECT id, name FROM base;
創建物化視圖
myview7
,指定列建立索引,默認全部列建立索引。CREATE MATERIALIZED VIEW myview7 ( INDEX (name), PRIMARY KEY (id) ) DISTRIBUTED BY HASH (id) AS SELECT id, name, age FROM base;
創建物化視圖
myview8
,指定分區鍵和注釋。CREATE MATERIALIZED VIEW myview8 ( name varchar(10), value double, KEY INDEX_ID(id) COMMENT 'id', CLUSTERED KEY INDEX(name, value), PRIMARY KEY(id) ) DISTRIBUTED BY hash(id) PARTITION BY value(date_format(dat, "%Y%m%d")) LIFECYCLE 30 COMMENT 'MATERIALIZED VIEW c' AS SELECT * FROM base;