物化視圖就是包含了查詢結果的數據庫對象,可能是對遠程數據的本地 copy,也可能是一個表或多表 join 后結果的行或列的子集,也可能是聚合后的結果。說白了,就是預先存儲查詢結果的一種數據庫對象。
在 Doris 中的物化視圖,就是查詢結果預先存儲起來的特殊的表。
物化視圖的出現主要是為了滿足用戶,既能對原始明細數據的任意維度分析,也能快速的對固定維度進行分析查詢。
適用場景
-
分析需求覆蓋明細數據查詢以及固定維度查詢兩方面。
-
查詢僅涉及表中的很小一部分列或行。
-
查詢包含一些耗時處理操作,比如:時間很久的聚合操作等。
-
查詢需要匹配不同前綴索引。
優勢
-
對于那些經常重復的使用相同的子查詢結果的查詢性能大幅提升。
-
Doris 自動維護物化視圖的數據,無論是新的導入,還是刪除操作都能保證 base 表和物化視圖表的數據一致性。無需任何額外的人工維護成本。
-
查詢時,會自動匹配到最優物化視圖,并直接從物化視圖中讀取數據。
-
自動維護物化視圖的數據會造成一些維護開銷,會在后面的物化視圖的局限性中展開說明。
物化視圖 VS Rollup
在沒有物化視圖功能之前,用戶一般都是使用 Rollup 功能通過預聚合方式提升查詢效率的。但是 Rollup 具有一定的局限性,他不能基于明細模型做預聚合。
物化視圖則在覆蓋了 Rollup 的功能的同時,還能支持更豐富的聚合函數。所以物化視圖其實是 Rollup 的一個超集。
也就是說,之前 ALTER TABLE ADD ROLLUP 語法支持的功能現在均可以通過CREATE MATERIALIZED VIEW 實現。
物化視圖原理
Doris 系統提供了一整套對物化視圖的 DDL 語法,包括創建,查看,刪除。DDL 的語法和 PostgreSQL, Oracle 都是一致的。但是 Doris 目前創建物化視圖只能在單表操作,不支持 join。
創建物化視圖
首先要根據查詢語句的特點來決定創建一個什么樣的物化視圖。并不是說物化視圖定義和某個查詢語句一模一樣就最好。這里有兩個原則:
(1)從查詢語句中抽象出,多個查詢共有的分組和聚合方式作為物化視圖的定義。
(2)不需要給所有維度組合都創建物化視圖。
首先第一個點,一個物化視圖如果抽象出來,并且多個查詢都可以匹配到這張物化視圖。這種物化視圖效果最好。因為物化視圖的維護本身也需要消耗資源。
如果物化視圖只和某個特殊的查詢很貼合,而其他查詢均用不到這個物化視圖。則會導致這張物化視圖的性價比不高,既占用了集群的存儲資源,還不能為更多的查詢服務。
所以用戶需要結合自己的查詢語句,以及數據維度信息去抽象出一些物化視圖的定義。
第二點就是,在實際的分析查詢中,并不會覆蓋到所有的維度分析。所以給常用的維度組合創建物化視圖即可,從而到達一個空間和時間上的平衡。
通過下面命令就可以創建物化視圖了。創建物化視圖是一個異步的操作,也就是說用戶成功提交創建任務后,Doris 會在后臺對存量的數據進行計算,直到創建成功。
具體的語法可以通過下面命令查看:
HELP CREATE MATERIALIZED VIEW
這里以一個銷售記錄表為例:
比如我們有一張銷售記錄明細表,存儲了每個交易的時間,銷售員,銷售門店,和金額。
提交完創建物化視圖的任務后,Doris 就會異步在后臺生成物化視圖的數據,構建物化視圖。
在構建期間,用戶依然可以正常的查詢和導入新的數據。創建任務會自動處理當前的存量數據和所有新到達的增量數據,從而保持和 base 表的數據一致性。用戶不需關心一致性問題。