ClickHouse 高級(二)優化(2)建表優化


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 倍。 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM