批量寫入又稱為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 ...