ClickHouse是如何批量寫入的?

2021-10-13 12:56:40 字數 2220 閱讀 7019

批量寫入又稱為bulk write,對於單錶插入多條資料的場景,可以減少插入請求數量,提高吞吐量和效率。clickhouse官方golang驅動clickhouse-go[1]支援該關鍵特性,但是文件的介紹不是很詳細,只有一句:

bulk write support : begin->prepare->(in loop exec)->commit
...

tx, err := connect.begin()

checkerr(err)

stmt, err := tx.prepare("insert into example (country_code, os_id, browser_id, categories, action_day, action_time) values (?, ?, ?, ?, ?, ?)")

checkerr(err)

for i := 0; i 

time.now(),

time.now(),

); err != nil 

}...

我寫的bulk write類似上面的**,但是提交給同事review時,他提出了疑問:stmt.exec是每次執行都傳送寫請求到資料庫嗎?這個問題其實我不敢肯定,官方文件也說得不明確。考慮到嚴謹性,讓自己的pr更有說服力,自己去翻看了相關源**。

這裡需要指出,如果利用編輯器裡的**跳轉功能會跳到database/sql庫中的exec函式實現,實際上我們要看的**是clickhouse-go中的實現,至於編輯器跳轉到database/sql中的原因,書寫此文時筆者也沒弄清楚,先挖個坑吧

stmt.exec的核心**如下[4]:

func (stmt *stmt) execcontext(ctx context.context, args driver.value) (driver.result, error) 

if (stmt.counter % stmt.ch.blocksize) == 0 

if err := stmt.ch.encoder.flush(); err != nil 

}  return emptyresult, nil

} if err := stmt.ch.sendquery(stmt.bind(convertoldargs(args))); err != nil 

if err := stmt.ch.process(); err != nil 

return emptyresult, nil

}

底層維護乙個快取block,同時設定block_size控制快取大小

因此block_size這個引數很重要,它表示本地快取的上限,如果很大的話,程式會占用一些記憶體。筆者起初設定為100000,在除錯日誌中看不到stmt.ch.logf("[exec] flush block")列印的log,設定小後就看到下面的輸出:

...

[clickhouse][connect=1][begin] tx=false, data=false

[clickhouse][connect=1][prepare]

[clickhouse][connect=1][read meta] 

[clickhouse][connect=1][exec] flush block

[clickhouse][connect=1][exec] flush block

....

很多資料庫驅動都支援bulk write特性,clickhouse-go這個驅動也不例外,但是它的文件寫得不是很詳細,只是在文件中指明要放在begin/commit中做。再加上clickhouse不支援事務,begin/commit這種寫法會讓人困惑。

[1]clickhouse-go:

[2]sqlx:

[3]官方樣例**: /blob/master/examples/sqlx.go#l35-l51

[4]核心**如下:

[5]insert into statement:

[6]go-clickhouse-batchinsert:

Clickhouse 批量執行SQL檔案等常用語句

有一堆或者太長的sql需要執行,可以寫成乙個檔案,批量執行 clickhouse client user 使用者名稱 password 密碼 d 資料庫 multiquery root temp.sql檢視sql的執行計畫 clickhouse client h localhost send log...

批量匯入是批量修改還是批量新增

1 一般基礎資料資訊的管理功能包括 新增 修改 刪除 查詢 匯入 匯出,比如物料資訊維護 這裡說到的匯入即相對於新增來說,即批量新增的功能 2 當我所有的資料資訊都完善了的情況下,由於業務的變更,需要給這些基礎資料資訊新增乙個字段資訊a 這個時候怎麼辦?3 注 在新增 修改 匯入模組都增加了字段資訊...

ClickHouse的負載均衡如何做。

1,負載均衡。目前我們公司後台使用clickhouse,來做資料的離線分析 配置為四台集群 shard 通過springboot clickhouse jdbc完成服務與clickhouse jdbc的連線 使用的是clickhouse官方,balancedclickhousedatasource ...