騰訊面試:Doris 物化視圖的使用場景是怎么樣的,有哪幾種數(shù)據(jù)更新方式?
一、Doris物化視圖
在大數(shù)據(jù)分析領(lǐng)域,隨著數(shù)據(jù)量的不斷增長和查詢復(fù)雜度的提高,如何高效地處理和分析數(shù)據(jù)成為了一個關(guān)鍵問題。Doris作為一款優(yōu)秀的分布式MPP分析型數(shù)據(jù)庫,提供了物化視圖這一強大的功能,能夠顯著提升查詢性能,降低計算成本。本文將詳細介紹Doris物化視圖的相關(guān)知識,包括其基本概念、原理、優(yōu)勢、使用場景、創(chuàng)建和管理方法等。
二、Doris物化視圖的基本概念
1. 定義
物化視圖是預(yù)先計算(根據(jù)定義的SELECT語句)并存儲在Doris中的一個特殊表中的數(shù)據(jù)集。它不同于普通的視圖,普通視圖只是一個虛擬的表,不存儲實際的數(shù)據(jù),而物化視圖是實實在在存儲了查詢結(jié)果的物理表。
2. 與普通視圖的區(qū)別
比較項 | 普通視圖 | 物化視圖 |
數(shù)據(jù)存儲 | 不存儲實際數(shù)據(jù),只保存SQL定義 | 存儲預(yù)先計算好的查詢結(jié)果 |
更新機制 | 查詢時執(zhí)行SQL語句獲取數(shù)據(jù),不涉及更新 | 基表數(shù)據(jù)變化時,需要通過刷新機制更新 |
查詢性能 | 每次查詢都要重新計算,性能相對較低 | 直接讀取存儲的結(jié)果,性能較高 |
三、Doris物化視圖的原理
1. 預(yù)計算和存儲
用戶根據(jù)自己的需求定義物化視圖的查詢語句,Doris系統(tǒng)會根據(jù)這個定義預(yù)先計算出查詢結(jié)果,并將結(jié)果存儲在物化視圖中。例如,對于一個銷售記錄表,用戶可以定義一個物化視圖來計算每個地區(qū)的銷售總額,Doris會在后臺計算并存儲這個結(jié)果。
2. 數(shù)據(jù)更新
當(dāng)基表數(shù)據(jù)發(fā)生變化時,物化視圖需要進行更新以確保數(shù)據(jù)的準(zhǔn)確性。Doris提供了不同的刷新機制來實現(xiàn)這一點:
- 同步物化視圖:當(dāng)基礎(chǔ)表更新時,物化視圖會實時同步更新,保證查詢結(jié)果的即時準(zhǔn)確性,適用于數(shù)據(jù)更新較少、對查詢響應(yīng)要求較高的場景。
- 異步物化視圖:當(dāng)基礎(chǔ)表更新時,物化視圖通過定期更新保持數(shù)據(jù)最終一致,可減少頻繁更新帶來的性能影響,適用于更新不頻繁、批量更新或?qū)崟r性要求不高的分析場景。
異步物化視圖還支持全量刷新和分區(qū)增量刷新兩種機制:
- 全量刷新:計算并刷新物化視圖定義SQL的所有數(shù)據(jù)。適合在數(shù)據(jù)量較小或數(shù)據(jù)架構(gòu)發(fā)生變化時使用,在對實時性要求不高的場景下可進行定期刷新。
- 分區(qū)增量刷新:當(dāng)物化視圖的基表分區(qū)數(shù)據(jù)發(fā)生變化時,可以識別并僅刷新變化的分區(qū),無需刷新整個物化視圖,相比全量/實時刷新顯著減少了計算和存儲開銷。該方式適用于大數(shù)據(jù)量場景,尤其是分區(qū)表頻繁變化且對實時性要求較高的場景。
3. 查詢優(yōu)化
在查詢過程中,系統(tǒng)會根據(jù)物化視圖的存在和內(nèi)容進行查詢優(yōu)化。Doris會自動判斷是否可以使用物化視圖來滿足當(dāng)前查詢,如果可以,則直接從物化視圖中讀取數(shù)據(jù)并計算,從而提高查詢效率。例如,當(dāng)查詢需要統(tǒng)計每個商品在不同時間維度(天、周、月)的銷售情況時,如果已經(jīng)創(chuàng)建了基于商品和時間維度的物化視圖,Doris會優(yōu)先使用該物化視圖來響應(yīng)查詢。
四、Doris物化視圖的優(yōu)勢
1. 查詢性能提升
對于那些經(jīng)常重復(fù)使用相同子查詢結(jié)果的查詢,性能得到了很大的提高。因為物化視圖預(yù)先存儲了查詢結(jié)果,查詢時無需重新計算,直接讀取數(shù)據(jù)即可,大大縮短了查詢響應(yīng)時間。例如,在電商場景中,假設(shè)需要統(tǒng)計每個商品在不同時間維度(天、周、月)的銷售情況。如果每次查詢都要從原始訂單表計算,顯然會很耗時。這時我們就可以創(chuàng)建一個基于商品和時間維度的異步物化視圖,提前計算好各個時間粒度的聚合結(jié)果。用戶查詢時直接使用物化視圖,響應(yīng)速度可提升10倍以上。
2. 數(shù)據(jù)一致性保障
Doris自動維護物化視圖的數(shù)據(jù),無論是新的導(dǎo)入還是刪除操作,都可以保證基表和物化視圖表的數(shù)據(jù)一致性。無需任何額外的人工維護成本,通過事務(wù)方式來保證原子性。比如如果用戶通過INSERT命令插入數(shù)據(jù)到基表中,則這條數(shù)據(jù)會同步插入到物化視圖中。當(dāng)基表和物化視圖表均寫入成功后,INSERT命令才會成功返回。
3. 降低計算成本
由于物化視圖存儲了預(yù)先計算好的結(jié)果,減少了查詢時的計算資源消耗,降低了整體的計算成本。特別是對于復(fù)雜的聚合和連接操作,物化視圖可以將這些耗時的操作預(yù)先完成,避免在每次查詢時都重新執(zhí)行。
4. 支持復(fù)雜查詢
物化視圖可以包含復(fù)雜的聚合和連接操作,適用于需要頻繁執(zhí)行相同復(fù)雜查詢的場景。它可以幫助用戶處理涉及多表連接、多層嵌套的聚合計算等復(fù)雜查詢,提高查詢效率。
五、Doris物化視圖的使用場景
1. 查詢加速
在決策支持系統(tǒng)中,如BI報表、Ad - Hoc查詢等,這類分析型查詢通常包含聚合操作,可能還涉及多表連接。由于計算此類查詢結(jié)果較為消耗資源、響應(yīng)時間可能長達分鐘級,且業(yè)務(wù)場景往往要求秒級響應(yīng),可以構(gòu)建物化視圖,對常見查詢進行加速。例如,傳統(tǒng)的多表JOIN查詢非常耗時,而物化視圖可以提前將匹配結(jié)果存好,查詢時直接取用,就像一個“紅娘”,大大提高了查詢效率。
2. 輕量化ETL(數(shù)據(jù)建模)
在數(shù)據(jù)分層場景中,可以通過嵌套物化視圖來構(gòu)建DWD和DWM層,利用物化視圖的調(diào)度刷新能力。異步物化視圖支持嵌套創(chuàng)建,可以基于已有的物化視圖再創(chuàng)建新的物化視圖,完美支持層層遞進的指標(biāo)體系。
3. 湖倉一體
針對多種外部數(shù)據(jù)源,可以將這些數(shù)據(jù)源所使用的表進行物化視圖構(gòu)建,以此來節(jié)省從外部表導(dǎo)入到內(nèi)部表的成本,并且加速查詢過程。當(dāng)查詢Hive等外部數(shù)據(jù)源時,網(wǎng)絡(luò)傳輸往往成為性能瓶頸。這時可以創(chuàng)建物化視圖將熱點數(shù)據(jù)緩存在Doris內(nèi)部,既保證了數(shù)據(jù)一致性,又能享受本地查詢的極致性能。
4. 實時聯(lián)邦查詢場景
面對分散在各個數(shù)據(jù)源的數(shù)據(jù),物化視圖可以作為一個“數(shù)據(jù)中轉(zhuǎn)站”,將多源數(shù)據(jù)統(tǒng)一整合并提供高效查詢。它可以將不同數(shù)據(jù)源的數(shù)據(jù)進行物化,方便用戶進行統(tǒng)一的查詢和分析。
六、Doris物化視圖的創(chuàng)建和管理
1. 創(chuàng)建物化視圖
(1) 創(chuàng)建權(quán)限
創(chuàng)建物化視圖需要具有物化視圖的創(chuàng)建權(quán)限(與建表權(quán)限相同)以及創(chuàng)建物化視圖查詢語句的查詢權(quán)限(與SELECT權(quán)限相同)。
(2) 創(chuàng)建語法
CREATE MATERIALIZED VIEW
[IFNOTEXISTS]<materialized_view_name>
[(<columns_definition>)]
[ BUILD <build_mode>]
[ REFRESH <refresh_method>[ refresh_trigger ]]
[[DUPLICATE]KEY(<key_cols>)]
[COMMENT'<table_comment>']
[PARTITIONBY(
{ <partition_col>| DATE_TRUNC (<partition_col>,<partition_unit>) } )]
[DISTRIBUTEDBY { HASH(<distribute_cols>)| RANDOM } [ BUCKETS { <bucket_count>| AUTO } ]
]
[ PROPERTIES (
-- Table property
<table_property>
-- Additional table properties
[,...])]
AS<query>
(3) 刷新配置
build_mode(刷新時機):
- IMMEDIATE:立即刷新,默認方式。
- DEFERRED:延遲刷新。
refresh_method(刷新方式):
- COMPLETE:刷新所有分區(qū)。
- AUTO:盡量增量刷新,只刷新自上次物化刷新后數(shù)據(jù)變化的分區(qū),如果不能感知數(shù)據(jù)變化的分區(qū),只能退化成全量刷新,刷新所有分區(qū)。
refresh_trigger(觸發(fā)方式):
- ON MANUAL(手動觸發(fā)):用戶通過SQL語句觸發(fā)物化視圖的刷新。例如,檢測基表的分區(qū)數(shù)據(jù)自上次刷新后是否有變化,刷新數(shù)據(jù)變化的分區(qū):REFRESH MATERIALIZED VIEW mvName AUTO;;不校驗基表的分區(qū)數(shù)據(jù)自上次刷新后是否有變化,直接刷新物化視圖的所有分區(qū):REFRESH MATERIALIZED VIEW mvName COMPLETE;;只刷新指定的分區(qū):REFRESH MATERIALIZED VIEW mvName partitions (partitionName1,partitionName2);。
- ON SCHEDULE(定時觸發(fā)):通過物化視圖的創(chuàng)建語句指定間隔多久刷新一次數(shù)據(jù)。例如,要求全量刷新,物化視圖每10小時刷新一次,并且刷新物化視圖的所有分區(qū):
CREATE MATERIALIZED VIEW mv_6
REFRESH COMPLETE ON SCHEDULE EVERY 10hour
AS
SELECT*FROM lineitem;
- ON COMMIT(自動觸發(fā)):自Apache Doris 2.1.4版本起支持此功能。基表數(shù)據(jù)發(fā)生變更后,自動觸發(fā)相關(guān)物化視圖刷新,刷新的分區(qū)范圍與“定時觸發(fā)”一致。但如果基表的數(shù)據(jù)頻繁變更,不太適合使用此種觸發(fā)方式,因為會頻繁構(gòu)建物化刷新任務(wù),消耗過多資源。
2. 支持的聚合函數(shù)
目前物化視圖創(chuàng)建語句支持的聚合函數(shù)有:
- SUM, MIN, MAX(Version 0.12)
- COUNT, BITMAP_UNION, HLL_UNION(Version 0.13)
需要注意的是,BITMAP_UNION的形式必須為:BITMAP_UNION(TO_BITMAP(COLUMN)) ,column列的類型只能是整數(shù)(largeint也不支持),或者BITMAP_UNION(COLUMN)且基表為AGG模型;HLL_UNION的形式必須為:HLL_UNION(HLL_HASH(COLUMN)) ,column列的類型不能是DECIMAL,或者HLL_UNION(COLUMN)且基表為AGG模型。
3. 查詢自動匹配
物化視圖創(chuàng)建成功后,用戶的查詢不需要發(fā)生任何改變,還是查詢基表。Doris會根據(jù)當(dāng)前查詢的語句去自動選擇一個最優(yōu)的物化視圖,從物化視圖中讀取數(shù)據(jù)并計算。用戶可以通過EXPLAIN命令來檢查當(dāng)前查詢是否使用了物化視圖。
4. 查詢物化視圖
查看當(dāng)前表都有哪些物化視圖,以及它們的表結(jié)構(gòu),可以使用以下命令:
desc table_name all;
5. 刪除物化視圖
使用以下命令刪除物化視圖:
DROP MATERIALIZED VIEW mv_name ON table_name;
Doris物化視圖是一種強大的工具,它通過預(yù)先計算和存儲查詢結(jié)果,顯著提升了查詢性能,降低了計算成本,同時保證了數(shù)據(jù)的一致性。在合適的場景下使用物化視圖,可以為大數(shù)據(jù)分析帶來更高的效率和更好的用戶體驗。