文章目錄
C# 如何新增資料至 ClickHouse
最近在評估導入 ClickHouse 的可行性,首先除了測試環境建立之外,最重要的就是要能夠透過 C# 來新增資料,所以今天就來紀錄如何透過 C# 來新增資料至 ClickHouse 並且比較不同 library 的優缺點
以下關於 ClickHouse 的介紹彙整自 ChatGPT3.5 與 Bard ,另外 What Is ClickHouse? 也提供了更詳細的說明
ClickHouse 是由俄羅斯公司 Yandex 開發並 open source 的列式數據庫,它具有以下特色:
列式存儲架構: ClickHouse使用列式存儲架構,將相同類型的數據存儲在一起,這種方式非常適合分析性查詢。列式存儲使得只擷取需要的欄位變得更加高效,這對於大規模的數據分析操作非常有利。
高效的壓縮算法: ClickHouse使用了多種高效的壓縮算法,減少數據在磁盤上的存儲空間,同時在查詢時能夠更迅速地解壓縮數據。這有助於節省硬件成本,提高系統性能。
支援實時數據更新: 雖然ClickHouse主要用於分析型查詢,但它也支援實時數據更新,能夠應對需要即時反饋的場景,擴展了其應用範圍。
分散式架構: ClickHouse的分散式架構使其能夠水平擴展,以應對不斷增長的數據量。這種能力對於處理大規模數據非常重要,同時也提高了系統的可靠性和容錯性。
ClickHouse 適用於以下情境:
大規模數據分析: ClickHouse最擅長處理大量數據的分析查詢,例如數據採礦、BI(商業智能)分析、日誌分析等。它能夠在秒級別內處理龐大的數據集,提供即時且準確的結果。
時序數據處理: ClickHouse在處理時序數據(例如日誌、事件時間數據)方面表現出色。其列式存儲和高效的壓縮算法使得它成為時序數據處理的理想選擇。
OLAP查詢: ClickHouse適合執行複雜的OLAP(On-Line Analytical Processing)查詢,支援諸如分組、排序、過濾等操作,為用戶提供靈活的數據分析功能。
具體來說,ClickHouse 在以下類型的查詢上具有較好的效能表現:
- 聚合查詢:ClickHouse 在聚合查詢上具有出色的性能表現,可在秒級內完成百萬級數據的聚合查詢。
- 分組查詢:ClickHouse 在分組查詢上也具有較好的性能表現,可在秒級內完成百萬級數據的分組查詢。
- 過濾查詢:ClickHouse 在過濾查詢上也具有較好的性能表現,可在毫秒級內完成百萬級數據的過濾查詢。
總而言之,ClickHouse 以其高效的列式存儲架構、強大的分析能力和分散式架構,成為處理大規模數據分析的優秀選擇,尤其在時序數據處理和OLAP查詢方面表現卓越。
基本環境說明
- macOS Sonoma 14.2.1 (Apple M2 Pro)
- OrbStack Version 1.2.0 (16496)
- .NET SDK 8.0.100
- JetBrains Rider 2023.3.2
Container Images
- clickhouse/clickhouse-server:23.11.3.23
NuGet Library
- Bogus 35.2.0
- BenchmarkDotNet 0.13.11
- ClickHouse.Ado 2.0.2.2
- ClickHouse.Client 6.8.1
docker-compose.yml
clickhouse DDL
使用方式
ClickHouse.Client
是 NuGet 近期下載量較多的 library,ClickHouse.Ado
則是發展較久,總下載量較高,都一併試試看
ClickHouse.Client
connection string 支援參數,詳細內容可以參考 GitHub:DarkWanderer/ClickHouse.Client:Connection string
Parameter name Description Value if omitted Database 連線的初始資料庫 default
Username Authentication username default
Password Authentication password Host ClickHouse server address localhost
Port ClickHouse server port 8123
or8443
(取決於Protocol
andlibrary version
)Driver 自 2.0 版本起已棄用 Binary
Compression 啟用資料的 GZip 壓縮 從版本 2.0 開始是 true
,之前是false
UseSession 允許使用伺服器會話 false
SessionId 指定 session ID (string) random GUID Timeout HTTP timeout duration 120
Protocol HTTP
orHTTPS
http
UseServerTimezone 對沒有 TZ 規範的日期時間列使用伺服器時區 從版本 6.0 開始是 true
,之前是false
UseCustomDecimals 使用 ClickHouseDecimal
classe 來處理 decimalfalse
程式碼
ClickHouse.Ado
connection string 支援參數,詳細內容可以參考 GitHub:ClickHouse.Test/ClickHouseConnectionSettingsTests/ToStringTests.cs 與 GitHub:ClickHouse.Ado/ClickHouseConnectionSettings.cs
Parameter name Default Value BufferSize 4096
SocketTimeout 1000
Host Port 9000
or9440
Database default
Compress false
Compressor 需要設定為 LZ4
CheckCompressedHash true
User Password 程式碼
完整程式碼
心得
- 雖然
ClickHouse.Ado
推出較早,但完全沒有文件可以參考,只能透過看 source code 或是 test case 來了解用法跟設定,單就這點就不是很理想 ClickHouse.Ado
沒有提供 release 版本,程式碼沒有經過最佳化,benchmark 也需要額外設定- protocol 與 port
ClickHouse.Ado
使用的tcp
連線,port 是9000
or9440
(tls)ClickHouse.Client
使用http
連線,port8123
or8443
(https)
- 我之前使用
ClickHouse.Client
有遇到 insert 速度很慢的狀況,後來換成ClickHouse.Ado
有解決問題,原本以為是 protocol 造成的差異;但這次整理做 benchmark 時也沒有遇到,甚至在資料量較多時(100 萬筆),ClickHouse.Client 比 ClickHouse.Ado 還快
,所以這點還需要再觀察 - NuGet 上的另個 library
Octonica.ClickHouseClient
近期的下載量也很高,但我照著 GitHub 上的 readme 跟 test 嘗試 bulk insert 都無法成功就不加入這次比較了
執行速度與 memory 耗用
完整程式碼請參考:GitHub:yowko/ClickHouseLibraryTest
參考資料
文章作者 Yowko Tsai
上次更新 2023-12-27
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。