相較於同步物化視圖,非同步物化視圖支援多表關聯以及更加豐富的彙總運算元。非同步物化視圖可以通過手動調用或定時任務的方式重新整理,並且支援重新整理部分分區,可以大幅降低重新整理成本。除此之外,非同步物化視圖支援多種查詢改寫情境,實現自動、透明查詢加速。本文為您介紹如何建立、使用和管理StarRocks中的非同步物化視圖。
背景介紹
資料倉儲環境中的應用程式經常基於多個大表執行複雜查詢,通常涉及多表之間數十億行資料的關聯和彙總。處理此類查詢通常會大量消耗系統資源和時間,造成極高的查詢成本。
您可以通過StarRocks中的非同步物化視圖解決以上問題。非同步物化視圖是一種特殊的物理表,其中儲存了基於基表特定查詢語句的預計算結果。當您對基表執行複雜查詢時,StarRocks可以直接複用預計算結果,避免重複計算,進而提高查詢效能。查詢的頻率越高或查詢語句越複雜,效能增益就會越明顯。
您還可以通過非同步物化視圖對資料倉儲進行建模,從而向上層應用提供統一的資料口徑,屏蔽底層實現,保護基表詳細資料安全。
物化視圖對比
StarRocks同步物化視圖(Rollup),可以提供更好的資料新鮮度和更低的重新整理成本。但是同步物化視圖在情境上有諸多限制,只可基於單一基表建立,且僅支援有限的彙總運算元。StarRocks非同步物化視圖,可以基於多個基表建立,且支援更豐富的彙總運算元。
下表從支援的特性角度比較了StarRocks中的非同步物化視圖以及同步物化視圖(Rollup)。
物化視圖 | 單表彙總 | 多表關聯 | 查詢改寫 | 重新整理策略 | 基表 |
非同步物化視圖 | 是 | 是 | 是 |
| 支援多表構建。基表可以來自:
|
同步物化視圖(Rollup) | 僅部分彙總函式 | 否 | 是 | 匯入同步重新整理 | 僅支援基於 Default Catalog 的單表構建 |
基本概念
概念 | 說明 |
基表(Base Table) | 物化視圖的驅動表。 對於StarRocks的非同步物化視圖,基表可以是Default Catalog中的內部表、外部資料目錄中的表,甚至是已有的非同步物化視圖或視圖。StarRocks支援在所有StarRocks表類型上建立非同步物化視圖。 |
重新整理(Refresh) | 建立非同步物化視圖後,其中的資料僅反映建立時刻基表的狀態。當基表中的資料發生變化時,需要通過重新整理非同步物化視圖更新資料變化。 目前StarRocks支援兩種非同步重新整理策略:
|
查詢改寫(Query Rewrite) | 查詢改寫是指在對已構建了物化視圖的基表進行查詢時,系統自動判斷是否可以複用物化視圖中的預計算結果處理查詢。如果可以複用,系統會直接從相關的物化視圖讀取預計算結果,以避免重複計算消耗系統資源和時間。 StarRocks支援基於SPJG類型非同步物化視圖的自動、透明查詢改寫。SPJG類型的物化視圖是指在物化視圖Plan中只包含Scan、Filter、Project以及Aggregate類型的運算元。 說明 基於JDBC Catalog和Hudi Catalog表構建的非同步物化視圖暫不支援查詢改寫。 |
使用情境
如果您的資料倉儲環境中有以下需求,我們建議您建立非同步物化視圖。
加速重複彙總查詢
假設您的數倉環境中存在大量包含相同彙總函式子查詢的查詢,佔用了大量計算資源,您可以根據該子查詢建立非同步物化視圖,計算並儲存該子查詢的所有結果。建立成功後,系統將自動改寫查詢語句,直接查詢非同步物化視圖中的中間結果,從而降低負載,加速查詢。
周期性多表關聯查詢
假設您需要定期將資料倉儲中多張表關聯,產生一張新的寬表,您可以為這些表建立非同步物化視圖,並設定定期重新整理規則,從而避免手動調度關聯任務。非同步物化視圖建立成功後,查詢將直接基於非同步物化視圖返回結果,從而避免關聯操作帶來的延遲。
數倉分層
假設您的基表中包含大量未經處理資料,查詢需要進行複雜的ETL操作,您可以通過對資料建立多層非同步物化視圖實現數倉分層。如此可以將複雜查詢分解為多層簡單查詢,既可以減少重複計算,又能夠協助維護人員快速定位問題。除此之外,數倉分層還可以將未經處理資料與統計資料解耦,從而保護敏感性未經處理資料。
湖倉加速
查詢資料湖可能由於網路延遲和Object Storage Service的吞吐限制而變慢。您可以通過在資料湖之上構建非同步物化視圖來提升查詢效能。此外,StarRocks可以智能改寫查詢以使用現有的物化視圖,省去了手動修改查詢的麻煩。
關於非同步物化視圖的具體使用案例,請參見:
建立非同步物化視圖
支援資料來源
StarRocks支援在以下資料來源建立非同步物化視圖:
StarRocks內部表(基表支援所有StarRocks表類型)
External Catalog中的表
Hive Catalog
Hudi Catalog
Iceberg Catalog
JDBC Catalog
已有非同步物化視圖
已有視圖
準備工作
以下樣本基於Default Catalog中的兩張基表:
表
goods包含產品IDitem_id1、產品名稱item_name和產品價格price。表
order_list包含訂單IDorder_id、客戶IDclient_id和產品IDitem_id2。
其中item_id1與item_id2等價。
建表並匯入如下資料。
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE goods(
item_id1 INT,
item_name STRING,
price FLOAT
) DISTRIBUTED BY HASH(item_id1);
INSERT INTO goods
VALUES
(1001,"apple",6.5),
(1002,"pear",8.0),
(1003,"potato",2.2);
CREATE TABLE order_list(
order_id INT,
client_id INT,
item_id2 INT,
order_date DATE
) DISTRIBUTED BY HASH(order_id);
INSERT INTO order_list
VALUES
(10001,101,1001,"2022-03-13"),
(10001,101,1002,"2022-03-13"),
(10002,103,1002,"2022-03-13"),
(10002,103,1003,"2022-03-14"),
(10003,102,1003,"2022-03-14"),
(10003,102,1001,"2022-03-14");該樣本業務情境需要頻繁分析訂單總額,則查詢需要將兩張表關聯並調用sum()函數,根據訂單ID和總額產生一張新表。除此之外,該業務情境需要每天重新整理訂單總額。
其查詢語句如下。
USE test_db;
SELECT
order_id,
sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;基於查詢語句建立非同步物化視圖
您可以通過CREATE MATERIALIZED VIEW語句為特定查詢語句建立物化視圖。
使用樣本
以下樣本根據上述查詢語句,基於表goods和表order_list建立一個“以訂單ID為分組,對訂單中所有商品價格求和”的非同步物化視圖,並設定其重新整理方式為ASYNC,每天自動重新整理。
USE test_db;
CREATE MATERIALIZED VIEW order_mv
DISTRIBUTED BY HASH(`order_id`)
REFRESH ASYNC START('2022-09-01 10:00:00') EVERY (interval 1 day)
AS SELECT
order_list.order_id,
sum(goods.price) as total
FROM order_list INNER JOIN goods ON goods.item_id1 = order_list.item_id2
GROUP BY order_id;建立非同步物化視圖時必須至少指定分桶和重新整理策略其中之一。
您可以為非同步物化視圖設定與其基表不同的分區和分桶策略,但非同步物化視圖的分區列和分桶列必須在查詢語句中。
非同步物化視圖支援分區上卷。例如,基表基於天做分區方式,您可以設定非同步物化視圖按月做分區。
非同步物化視圖暫不支援使用List分區策略,亦不支援基於使用List分區的基表建立。
建立物化視圖的查詢語句不支援非確定性函數,其中包括rand()、random()、uuid()和sleep()。
非同步物化視圖支援多種資料類型。
預設情況下,執行CREATE MATERIALIZED VIEW語句後,StarRocks將立即開始重新整理任務,這將佔用一定系統資源。如需延遲重新整理時間,請添加REFRESH DEFERRED參數。
注意事項
非同步物化視圖重新整理機制
目前,StarRocks支援兩種ON DEMAND重新整理策略,即非同步重新整理(ASYNC)和手動重新整理(MANUAL)。
在此基礎上,非同步物化視圖支援多種重新整理機制,以控制重新整理開銷並保證重新整理成功率:
支援設定重新整理最大分區數。當一張非同步物化視圖擁有較多分區時,單次重新整理將耗費較多資源。您可以通過設定該重新整理機制來指定單次重新整理的最大分區數量,從而將重新整理任務進行拆分,保證資料量多的物化視圖能夠分批、穩定的完成重新整理。
支援為非同步物化視圖的分區指定Time to Live(TTL),從而減少非同步物化視圖佔用的儲存空間。
支援指定重新整理範圍,只重新整理最新的幾個分區,減少重新整理開銷。
支援設定資料變更不會觸發對應物化視圖自動重新整理的基表。
支援為重新整理任務設定資源群組。
您還可以使用
ALTER MATERIALIZED VIEW修改現有非同步物化視圖的重新整理機制。說明為避免全量重新整理任務耗盡系統資源導致任務失敗,建議您基於分區基表建立分區物化視圖,保證基表分區中的資料更新時,只有物化視圖對應的分區會被重新整理,而非重新整理整個物化視圖。詳細資料,請參考分區建模。
嵌套物化視圖
StarRocks支援嵌套非同步物化視圖,即基於非同步物化視圖構建新的非同步物化視圖。每個非同步物化視圖的重新整理方式僅影響當前物化視圖。當前StarRocks不對嵌套層數進行限制。生產環境中建議嵌套層數不超過三層。
External Catalog物化視圖
StarRocks支援基於Hive Catalog、Hudi Catalog、Iceberg Catalog以及JDBC Catalog構建非同步物化視圖。外部資料目錄物化視圖的建立方式與普通非同步物化視圖相同,但有使用限制。詳細資料,請參見使用物化視圖加速資料湖查詢。
手動重新整理非同步物化視圖
您可以通過REFRESH MATERIALIZED VIEW命令手動重新整理指定非同步物化視圖。
-- 非同步呼叫重新整理任務。
REFRESH MATERIALIZED VIEW test_db.order_mv;
-- 同步調用重新整理任務。
REFRESH MATERIALIZED VIEW test_db.order_mv WITH SYNC MODE;您可以通過CANCEL REFRESH MATERIALIZED VIEW取消非同步呼叫的重新整理任務。
-- 取消重新整理任務。
CANCEL REFRESH MATERIALIZED VIEW test_db.order_mv;
-- 強製取消重新整理任務。
CANCEL REFRESH MATERIALIZED VIEW test_db.order_mv FORCE;直接查詢非同步物化視圖
非同步物化視圖本質上是一個物理表,其中儲存了根據特定查詢語句預先計算的完整結果集。在物化視圖第一次重新整理後,您即可直接查詢物化視圖。
SELECT * FROM test_db.order_mv;您可以直接查詢非同步物化視圖,但由於非同步重新整理機制,其結果可能與您從基表上查詢的結果不一致。
使用非同步物化視圖改寫加速查詢
StarRocks支援SPJG類型的非同步物化視圖查詢的自動透明改寫。其查詢改寫包括單表改寫,Join改寫,彙總改寫,Union改寫和嵌套物化視圖的改寫。自v3.3.0起,StarRocks進一步支援基於文本的物化視圖改寫。詳細內容,請參考物化視圖查詢改寫。
目前,StarRocks支援基於Default Catalog、Hive Catalog、Hudi Catalog和Iceberg Catalog的非同步物化視圖的查詢改寫。當查詢Default Catalog資料時,StarRocks通過排除資料與基表不一致的物化視圖,來保證改寫之後的查詢與原始查詢結果的強一致性。當物化視圖資料到期時,不會作為候選物化視圖。在查詢外部目錄資料時,由於StarRocks無法感知外部目錄分割中的資料變化,因此不保證結果的強一致性。關於基於External Catalog的非同步物化視圖,請參考使用物化視圖加速資料湖查詢。
基於JDBC Catalog表構建的非同步物化視圖暫不支援查詢改寫。
管理非同步物化視圖
修改非同步物化視圖
您可以通過ALTER MATERIALIZED VIEW命令修改非同步物化視圖屬性。
啟用被禁用的非同步物化視圖(將物化視圖的狀態設定為Active)。
ALTER MATERIALIZED VIEW test_db.order_mv ACTIVE;修改非同步物化視圖名稱為
order_total。ALTER MATERIALIZED VIEW test_db.order_mv RENAME order_total;修改非同步物化視圖的最大重新整理間隔為2天。
ALTER MATERIALIZED VIEW test_db.order_mv REFRESH ASYNC EVERY(INTERVAL 2 DAY);
查看非同步物化視圖
您可以使用SHOW MATERIALIZED VIEWS或查詢Information Schema中的系統中繼資料視圖來查看資料庫中的非同步物化視圖。
查看當前資料倉儲內所有非同步物化視圖。
USE test_db; SHOW MATERIALIZED VIEWS;查看特定非同步物化視圖。
USE test_db; SHOW MATERIALIZED VIEWS WHERE NAME = "order_mv";通過名稱匹配查看非同步物化視圖。
USE test_db; SHOW MATERIALIZED VIEWS WHERE NAME LIKE "order%";通過Information Schema中的系統中繼資料視圖
materialized_views查看所有非同步物化視圖。USE test_db; SELECT * FROM information_schema.materialized_views;
查看非同步物化視圖建立語句
您可以通過SHOW CREATE MATERIALIZED VIEW命令查看非同步物化視圖建立語句。
SHOW CREATE MATERIALIZED VIEW test_db.order_mv;查看非同步物化視圖的執行狀態
您可以通過以下兩種方式查看非同步物化視圖的執行狀態。
通過EMR StarRocks Manager的物化視圖管理 > 非同步物化視圖頁面進行查看。
通過查詢StarRocks 的Information Schema中的
tasks和task_runs中繼資料視圖來查看非同步物化視圖的執行(構建或重新整理)狀態。樣本如下。
查看
tasks表中最新任務的TASK_NAME。SELECT * FROM information_schema.tasks ORDER BY CREATE_TIME DESC limit 1;基於查詢到的
TASK_NAME在表task_runs中查看執行狀態。SELECT * FROM information_schema.task_runs WHERE task_name='mv-59299' ORDER BY CREATE_TIME;
刪除非同步物化視圖
您可以通過DROP MATERIALIZED VIEW命令刪除已建立的非同步物化視圖。
DROP MATERIALIZED VIEW test_db.order_mv;