ClickHouse-優化(建表、配置)
阿新 • • 發佈:2022-04-21
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); CREATE TABLE t_type3 ( `id` UInt32, `sku_id` String, `total_amount` Decimal(16, 2), `create_time` DateTime ) ENGINE = ReplacingMergeTree(create_time) PARTITION BY toYYYYMMDD(create_time) PRIMARY KEY id ORDER BY (id, sku_id);
1.2空值儲存型別
官方已經指出 Nullable 型別幾乎總是會拖累效能,因為儲存 Nullable 列時需要建立一個額外的檔案來儲存 NULL 的標記,並且 Nullable 列無法被索引。因此除非極特殊情況,應直接使用欄位預設值表示空,或者自行指定一個在業務中無意義的值(例如用-1 表示沒有商品ID)。date1002 :) CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog; CREATE TABLE t_null ( `x` Int8, `y` Nullable(Int8) ) ENGINE檢視儲存的檔案= TinyLog Query id: 4a313cb8-86a7-4bf0-99a9-16a945e665ac Ok. 0 rows in set. Elapsed: 0.003 sec. date1002 :) INSERT INTO t_null VALUES (1, NULL), (2, 3); INSERT INTO t_null FORMAT Values Query id: ebd34cde-af7a-46e4-8956-b2ddc8afc09b Ok. 2 rows in set. Elapsed: 0.002 sec. date1002 :) SELECT x + y FROM t_null; SELECT x + y FROM t_null Query id: fe7448ca-2147-43ac-8afe-725852577fe0 ┌─plus(x, y)─┐ │ ᴺᵁᴸᴸ │ │ 5 │ └────────────┘
[root@date1002 ~]# cd /var/lib/clickhouse/data/default/t_null/ [root@date1002 t_null]# ll 總用量 16 -rw-r----- 1 clickhouse clickhouse 95 4月 20 22:06 sizes.json -rw-r----- 1 clickhouse clickhouse 28 4月 20 22:06 x.bin -rw-r----- 1 clickhouse clickhouse 28 4月 20 22:06 y.bin -rw-r----- 1 clickhouse clickhouse 28 4月 20 22:06 y.null.biny欄位可以為null的話,會有一個檔案單獨儲存null值
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)
……