全部產品
Search
文件中心

AnalyticDB:建立物化視圖

更新時間:Dec 28, 2024

AnalyticDB for MySQL物化視圖會將使用者定義的查詢提前計算好並將查詢結果儲存起來。在分析複雜查詢時可以直接從物化視圖中讀取預先計算好的查詢結果,從而加快查詢回應時間。本文主要介紹如何建立物化視圖。

許可權要求

  • 建立視圖需要有資料庫或表層級的CREATE許可權。

  • 重新整理物化視圖需要有資料庫或表層級的INSERT許可權。

  • 需要有物化視圖所涉及的所有表的相關列(或整個表)的SELECT許可權。

  • 如果在建立物化視圖時指定物化視圖為自動重新整理模式,需要具備通過伺服器本地(即127.0.0.1)或者任意IP(即'%')重新整理視圖的許可權。

使用限制

  • 不支援對物化視圖執行INSERTDELETEUPDATE操作。

  • 不支援刪除或重新命名物化視圖的基表或基表中的列。如需修改基表需要先刪除物化視圖。

  • 預設情況下,一個AnalyticDB for MySQL叢集支援建立的物化視圖上限如下:

    • 叢集版本低於3.1.4.7:最多支援建立8個物化視圖。

    • 叢集版本等於或大於3.1.4.7:最多支援建立64個物化視圖。

    說明
    • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

    • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

文法

CREATE [OR REPLACE] MATERIALIZED VIEW <mv_name>
[MV DEFINITION]
[MV_PROPERTIES=<MV_PROPERTIES>]
[REFRESH [COMPLETE|FAST] [ON [DEMAND |OVERWRITE] [START WITH date] [NEXT date]]]
[QUERY REWRITE]
AS 
<QUERY BODY>;

參數說明

參數

說明

OR REPLACE

根據是否存在重名物化視圖選擇對應的規則來建立物化視圖,具體規則如下:

  • 若不存在重名物化視圖,則直接建立一個新視圖。

  • 若存在重名物化視圖,則先刪除原有的重名物化視圖,再重新建立。

說明

僅3.1.4.7及以上核心版本叢集支援該參數。

  • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

  • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

mv_name

物化視圖名稱。

MV DEFINITION

定義物化視圖中表相關的特性。

  • 物化視圖使用一張普通的表結構來儲存資料。建立物化視圖時支援使用普通表定義中所有的參數,如分區鍵、分布鍵、索引和冷熱資料存放區策略等。建立物化視圖時建議定義分區鍵和主鍵,以提高後續查詢效能。關於建立普通表支援的參數說明,請參見CREATE TABLE

  • 物化視圖和普通表一樣,預設全列建立索引。為減少儲存空間和寫入I/O,如果不需要全列建立索引,您可以指定INDEX關鍵字對特定列建立索引。在物化視圖中建索引的方式與普通表的文法一致,建索引的語句,請參見CREATE TABLE

  • 與建立表的文法一致,建立物化視圖時也不支援定義查詢中沒有輸出的列。

[REFRESH [COMPLETE|FAST]

定義物化視圖的重新整理模式。取值如下:

  • COMPLETE(預設):全量重新整理。全量重新整理的詳細介紹,請參見全量重新整理物化視圖

  • FAST:增量重新整理。增量重新整理功能的使用限制等,請參見增量重新整理物化視圖

    說明

    3.1.9.0及以上版本支援單表增量重新整理物化視圖;3.2.0.0及以上版本支援多表增量重新整理物化視圖。更多內容,請參見增量重新整理物化視圖

    • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

    • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

ON [DEMAND |OVERWRITE]

重新整理物化視圖的條件。取值如下:

  • DEMAND(預設):按需重新整理。即您可以在需要重新整理物化視圖時手動觸發重新整理,或根據重新整理需求配置NEXT自動觸發重新整理。

  • OVERWRITE:物化視圖的基表在執行INSERT OVERWRITE語句導致資料被覆蓋後,重新整理物化視圖。適合通過Batchload大量匯入資料的情境。

    說明

    配置ON OVERWRITE時,不能定義START WITHNEXT

START WITH

定義物化視圖的首次重新整理時間。選填參數,若不填,則預設首次重新整理時間為目前時間點。

說明

支援使用時間函數,但只支援精確到秒,毫秒部分會被截斷。更多關於重新整理物化視圖的詳情,請參見全量重新整理物化視圖增量重新整理物化視圖

NEXT

定義物化視圖的下次重新整理時間。若需要設定自動重新整理,NEXT參數必填。

QUERY REWRITE

是否開啟查詢改寫功能。開啟後查詢可被自動改寫到物化視圖上,物化視圖可以被當作緩衝使用。取值如下:

  • DISABLE QUERY REWRITE(預設值):關閉當前物化視圖的查詢改寫功能。

  • ENABLE QUERY REWRITE:開啟當前物化視圖的查詢改寫功能。

說明

僅3.1.4及以上核心版本叢集支援開啟該功能。如何查看叢集版本,請參見查看版本

  • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

  • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

QUERY BODY

定義物化視圖的查詢主體,查詢主體可以是表、邏輯視圖或者物化視圖。其中:

  • 需要為查詢中輸出的運算式列定義別名,建議使用具有實際意義的別名。例如(SUM(price) AS total_price),表示設定運算式列SUM(price)的別名為total_price

  • 物化視圖查詢所涉及的基表不可被刪除,且基表中的列不可被刪除或修改。

  • 支援使用WITH文法。

  • 增量重新整理的物化視圖QUERY BODY還需注意以下內容:

    • 增量重新整理的物化視圖QUERY BODY中,不允許出現非確定性運算式作為條件,如:now()rand()等。

    • 彙總操作支援COUNT、SUM、MAX、MIN、AVG、APPROX_DISTINCT和COUNT(DISTINCT)函數。

      說明

      僅3.2.2.1及以上版本,支援MAX、MIN、AVG、APPROX_DISTINCT和COUNT(DISTINCT)函數。

    • 使用MAX、MIN、APPROX_DISTINCT或COUNT(DISTINCT)函數時,增量物化視圖的基表只允許執行INSERT操作。基表在執行DELETE、UPDATE、REPLACE、INSERT ON DUPLICATE KEY UPDATE等會導致資料刪除的操作時會報錯,因此基表禁止執行這些操作。

    • COUNT(DISTINCT)僅支援INTEGER類型。

    • AVG不支援DECIMAL類型。

    • 彙總操作不支援HAVING關鍵字。

    • 除COUNT(DISTINCT)外,其餘彙總操作均不支援DISTINCT關鍵字。

    • 不支援視窗函數。

    • 不支援排序操作。

    • 不支援 UNION、EXCEPT、INTERSECT等集合操作。

MV_PROPERTIES

建立彈性物化視圖,需要配置MV_PROPERTIES。彈性物化視圖指建立和重新整理物化視圖時使用Job型資源群組動態拉起的資源,可以有效降低成本,但是重新整理速度相較普通物化視圖會有所降低。

建立彈性物化視圖需滿足以下條件:

  • 叢集的產品系列為湖倉版

  • 叢集核心版本需為3.1.9.3及以上版本。

MV_PROPERTIES屬性包括mv_resource_groupmv_refresh_hints參數,格式為JSON。

  • mv_resource_group:指定彈性物化視圖所使用的Job型資源群組。若指定的Job型型資源群組不存在,建立彈性物化視圖時會報錯。

  • mv_refresh_hints:彈性物化視圖支援配置的參數。支援配置的參數詳情,請參見配置參數

樣本

  • 建立物化視圖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;
  • 建立彈性物化視圖myview9,每天重新整理一次,彈性資源群組為my_job_rg_1。

    CREATE MATERIALIZED VIEW myview9
    MV_PROPERTIES='{
      "mv_resource_group":"my_job_rg_1",
      "mv_refresh_hints":{"query_priority":"HIGH"}
    }'
    REFRESH COMPLETE ON DEMAND
    START WITH now()
    NEXT now() + INTERVAL 1 DAY
    AS
    SELECT * FROM base;

相關文檔