1 數據類型
1.1 時間字段的類型
建表時能用數值型或日期時間型表示的字段就不要用字符串,全 String 類型在以 Hive為中心的數倉建設中常見,但 ClickHouse 環境不應受此影響。
雖然 ClickHouse 底層將 DateTime 存儲為時間戳 Long 類型,但不建議存儲 Long 類型,因為
DateTime 不需要經過函數轉換處理,執行效率高、可讀性好。
create table t_type2( id UInt32, sku_id String, total_amount Decimal(16,2) , create_time Int32 ) engine =ReplacingMergeTree(create_time) partition by toYYYYMMDD(toDate(create_time)) –-需要轉換一次,否則報錯 primary key (id) order by (id, sku_id);
1.2 空值存儲類型
官方已經指出
Nullable 類型幾乎總是會拖累性能,因為存儲 Nullable 列時需要創建一個額外的文件來存儲 NULL 的標記,並且 Nullable 列無法被索引。因此除非極特殊情況,應直接
使用字段默認值表示空,或者自行指定一個在業務中無意義的值(例如用-1 表示沒有商品ID)。
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog; INSERT INTO t_null VALUES (1, NULL), (2, 3); SELECT x + y FROM t_null;
查看存儲的文件:(沒有權限就用 root 用戶)
官網說明:https://clickhouse.tech/docs/zh/sql-reference/data-types/nullable/
2 分區和索引
分區粒度根據業務特點決定,不宜過粗或過細。一般選擇
按天分區,也可以指定為 Tuple(),以單表一億數據為例,分區大小控制在 10-30 個為最佳。
必須指定索引列,ClickHouse 中的
索引列即排序列,通過
order by 指定,一般在查詢條件中經常被用來充當篩選條件的屬性被納入進來;可以是單一維度,也可以是組合維度的索引;通常需要滿足高級列在前、
查詢頻率大的在前原則;還有基數特別大的不適合做索引列,如用戶表的 userid 字段;通常
篩選后的數據滿足在百萬以內為最佳。
比如官方案例的 hits_v1 表:
…… PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) ……
visits_v1 表:
…… PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID) ……
3 表參數
Index_granularity 是用來控制索引粒度的,默認是 8192,如非必須不建議調整。
如果表中不是必須保留全量歷史數據,建議指定 TTL(生存時間值),可以免去手動過期歷史數據的麻煩,TTL 也可以通過 alter table 語句隨時修改。(參考基礎文檔 4.4.5 數據 TTL)
4 寫入和刪除優化
(1)盡量不要執行單條或小批量刪除和插入操作,這樣會產生小分區文件,給后台Merge 任務帶來巨大壓力
(2)不要一次寫入太多分區,或數據寫入太快,數據寫入太快會導致 Merge 速度跟不上而報錯,一般建議每秒鍾發起 2-3 次寫入操作,每次操作寫入 2w~5w 條數據(依服務器性能而定)寫入過快報錯,報錯信息:
1. Code: 252, e.displayText() = DB::Exception: Too many parts(304). Merges are processing significantly slower than inserts 2. Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded:would use 9.37 GiB (attempt to allocate chunk of 301989888 bytes), maximum: 9.31 GiB
處理方式:
“ Too many parts 處理 ” :使用 WAL 預寫日志,提高寫入性能。
in_memory_parts_enable_wal 默認為 true
在服務器內存充裕的情況下增加內存配額,一般通過 max_memory_usage 來實現
在服務器內存不充裕的情況下,建議將超出部分內容分配到系統硬盤上,但會降低執行速度,一般通過 max_bytes_before_external_group_by、max_bytes_before_external_sort 參數來實現。
5 常見配置
配置項主要在 config.xml 或 users.xml 中, 基本上都在 users.xml 里
➢config.xml 的配置項 (服務端配置)
https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/
➢users.xml 的配置項
https://clickhouse.tech/docs/en/operations/settings/settings/
5.1 CPU 資源

5.2 內存資源
5.3 存儲
ClickHouse 不支持設置多數據目錄,為了提升數據 io 性能,可以掛載虛擬券組,一個券組綁定多塊物理磁盤提升讀寫性能,多數據查詢場景 SSD 會比普通機械硬盤快 2-3 倍。
