clickhouse(十一)物化檢視使用二
在上一篇關於物化檢視的文章中, 我們介紹了一種構造ClickHouse物化檢視的方法, 該檢視使用SummingMergeTree引擎計算總和和計數. SummingMergeTree可以為這兩種型別的聚合使用普通的SQL語法. 我們還讓物化檢視定義自動為資料建立基礎表(.inner表). 這兩種技術都很快速, 但對生產系統有限制(都不太適用於生產環境).
在本篇文章中, 我們將展示如何在現有的表上建立一個具有一系列聚合型別的物化檢視. 當您需要計算的不僅僅是簡單的總和時, 此方法非常適合. 對於表中有大量正在插入的資料(針對Part 1)中的POPULATE
, 使用POPULATE會填充歷史資料, 但這期間向原表中新插入資料會被忽略掉而不會寫入物化檢視中)或必須處理表結構變更的情況, 這也非常方便.
使用State函式和To Tables建立更靈活的物化檢視
線上面的例子中, 我們將測量裝置的讀數. 讓我們從表定義開始.
1
|
CREATE TABLE counter (
|
接下來, 我們新增足夠的資料, 以使查詢速度變得足夠慢: 10個裝置的10億行合成數據. 注意: 如果您要嘗試這些操作, 只需輸入100萬行即可. 無論資料量如何, 示例都可以工作.
1
|
INSERT INTO counter SELECT
|
現在, 讓我們看一下我們希望定期執行的示例查詢. 它彙總了整個取樣期間所有裝置的所有資料. 在這種情況下, 這意味著表中3.25年的資料, 都是在2019年之前.
1
|
SELECT
|
前面的查詢很慢, 因為它必須讀取表中的所有資料才能獲得答案. 我們想要設計一個物化檢視, 該檢視讀取的資料要少得多. 事實證明, 如果我們定義了一個每天彙總資料的檢視, 則ClickHouse將正確地在整個時間間隔內彙總每天的資料.
與前面的簡單示例(Part 1)不同, 我們將自己定義目標(.inner表)表. 這樣做的好處是, 該表現在可見, 這使得載入資料以及進行模式遷移(表結構變更)更加容易. 下面是目標表的定義.
1
|
CREATE TABLE counter_daily (
|
該表定義引入了一種新的資料型別, 稱為AggregateFunction, 該資料型別儲存部分聚合的資料(which holds partially aggregated data). 這個資料型別用於sum和count以外的聚合需求. 接下來, 我們建立相應的物化檢視. 它從counter(源表)中選擇資料, 並使用CREATE語句中的特殊TO語法將資料傳送到counter_daily(目標表). 該表有聚合函式, SELECT語句有與之相匹配的函式, 如’ maxState ‘. 我們將在詳細討論聚合函式時討論它們之間的關係.
1
|
CREATE MATERIALIZED VIEW counter_daily_mv
|
TO關鍵字使我們可以指向目標表(儲存物化檢視資料的表, 在本例中即是counter_daily表), 但有一個缺點. ClickHouse不允許在TO中使用POPULATE關鍵字. 因此, 物化檢視建立後沒有任何資料. 我們將手動載入資料. 但是, 我們還將使用一個不錯的技巧, 使我們可以避免在同時進行活動資料載入的情況下出現問題.
注意, 檢視定義有一個WHERE子句. 這意味著2019年之前的任何資料都應該被忽略. 我們現在有了一種不丟失資料的方法來處理資料載入. 該檢視將處理2019年到達的新資料. 同時, 我們可以通過插入載入2018年及之前的舊資料.
讓我們通過將新資料載入到counter表中來演示它是如何工作的. 新資料將於2019年開始, 並將自動載入到檢視中.
1
|
INSERT INTO counter
|
現在, 使用以下INSERT手動載入舊資料. 它會載入2018年及之前的所有資料.
1
|
INSERT INTO counter_daily
|
我們終於可以從檢視中查詢資料了. 與目標表和物化化檢視一樣, ClickHouse使用專用語法從檢視中進行選擇.
1
|
物化檢視目標表 |