clickhouse創建Mergetree系表詳解


CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2,
    ...
    PROJECTION projection_name_1 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY]),
    PROJECTION projection_name_2 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY])
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr
    [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ]
    [WHERE conditions]
    [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ]
[SETTINGS name=value, ...]

 

  • ENGINE— 引擎的名稱和參數。ENGINE = MergeTree()MergeTree引擎沒有參數

  • ORDER BY— 排序鍵。

    列名或任意表達式的元組。示例:ORDER BY (CounterID, EventDate)

    如果子句沒有明確定義主鍵,ClickHouse 使用排序鍵作為主鍵PRIMARY KEY

    ORDER BY tuple()如果不需要排序,請使用語法。請參閱選擇主鍵

  • PARTITION BY分區鍵可選的。在大多數情況下,您不需要分區鍵,而在大多數其他情況下,您不需要比幾個月更細的分區鍵。分區不會加速查詢(與 ORDER BY 表達式相反)。你永遠不應該使用太細化的分區。不要按客戶端標識符或名稱對數據進行分區(而是將客戶端標識符或名稱作為 ORDER BY 表達式中的第一列)。

    對於按月分區,請使用toYYYYMM(date_column)表達式,其中date_column是日期類型為Date的列。此處的分區名稱具有"YYYYMM"格式。

  • PRIMARY KEY— 主鍵(如果它與排序鍵不同)可選的。

    默認情況下,主鍵與排序鍵(由ORDER BY子句指定)相同。因此,在大多數情況下,沒有必要指定單獨的PRIMARY KEY子句。

  • SAMPLE BY— 抽樣表達式。可選的。

    如果使用采樣表達式,則主鍵必須包含它。采樣表達式的結果必須是無符號整數。示例:SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))

  • TTL— 指定行的存儲持續時間和定義磁盤和卷之間的自動部件移動邏輯的規則列表。可選的。

    表達式必須有一個DateDateTime列作為結果。例子: TTL date + INTERVAL 1 DAY

    規則的類型DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'|GROUP BY指定在滿足表達式(達到當前時間)時對部件執行的操作:刪除過期行,將部件(如果部件中的所有行都滿足表達式)移動到指定磁盤(TO DISK 'xxx')或到卷 ( TO VOLUME 'xxx'),或聚合過期行中的值。規則的默認類型是刪除 ( DELETE)。可以指定多個規則的列表,但不能超過一個DELETE

    有關更多詳細信息,請參閱列和表的 TTL

  • SETTINGSMergeTree— 控制(可選)行為的附加參數:

    • index_granularity— 索引標記之間的最大數據行數。默認值:8192。請參閱數據存儲
    • index_granularity_bytes— 數據顆粒的最大大小(以字節為單位)。默認值:10Mb。要僅通過行數限制粒度大小,請設置為 0(不推薦)。請參閱數據存儲
    • min_index_granularity_bytes— 允許的最小數據顆粒大小(以字節為單位)。默認值:1024b。防止意外創建 index_granularity_bytes 非常低的表。請參閱數據存儲
    • enable_mixed_granularity_parts— 啟用或禁用過渡以使用index_granularity_bytes設置控制顆粒大小。在 19.11 版本之前,只有index_granularity限制顆粒大小的設置。當從具有大行(數十和數百兆字節)的表中選擇數據時,該index_granularity_bytes設置提高了 ClickHouse 的性能。如果您有大行的表,您可以為表啟用此設置以提高SELECT查詢效率。
    • use_minimalistic_part_header_in_zookeeper— ZooKeeper 中數據部分標頭的存儲方法。如果use_minimalistic_part_header_in_zookeeper=1,則 ZooKeeper 存儲的數據較少。更多信息請參見“服務器配置參數”中的設置說明
    • min_merge_bytes_to_use_direct_io— 使用直接 I/O 訪問存儲磁盤所需的合並操作的最小數據量。合並數據部分時,ClickHouse 會計算所有待合並數據的總存儲量。如果卷超過字節,ClickHouse 使用直接 I/O 接口(選項)min_merge_bytes_to_use_direct_io讀取和寫入數據到存儲磁盤。O_DIRECT如果min_merge_bytes_to_use_direct_io = 0,則禁用直接 I/O。默認值:10 * 1024 * 1024 * 1024字節。
    • merge_with_ttl_timeout— 使用刪除 TTL 重復合並之前的最小延遲(以秒為單位)。默認值:14400秒(4 小時)。
    • merge_with_recompression_ttl_timeout— 使用重新壓縮 TTL 重復合並之前的最小延遲(以秒為單位)。默認值:14400秒(4 小時)。
    • try_fetch_recompressed_part_timeout— 開始合並重新壓縮之前的超時(以秒為單位)。在此期間,ClickHouse 嘗試從分配此合並重新壓縮的副本中獲取重新壓縮的部分。默認值:7200秒(2 小時)。
    • write_final_mark— 啟用或禁用在數據部分末尾(最后一個字節之后)寫入最終索引標記。默認值:1。不要關閉它。
    • merge_max_block_size— 用於合並操作的塊中的最大行數。默認值:8192。
    • storage_policy— 存儲策略。請參閱使用多個塊設備進行數據存儲
    • min_bytes_for_wide_partmin_rows_for_wide_part— 可以以Wide格式存儲的數據部分中的最小字節數/行數。您可以設置其中一項、兩項設置或不設置任何一項。請參閱數據存儲
    • max_parts_in_total— 所有分區中的最大零件數。
    • max_compress_block_size— 壓縮以寫入表之前未壓縮數據塊的最大大小。您還可以在全局設置中指定此設置(請參閱max_compress_block_size設置)。創建表時指定的值會覆蓋此設置的全局值。
    • min_compress_block_size— 寫入下一個標記時壓縮所需的未壓縮數據塊的最小大小。您還可以在全局設置中指定此設置(請參閱min_compress_block_size設置)。創建表時指定的值會覆蓋此設置的全局值。
    • max_partitions_to_read— 限制一個查詢中可以訪問的最大分區數。您還可以在全局設置中指定設置max_partitions_to_read 。

  部分設置示例

ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192
 

  在示例中,設置按月分區。

  我們還將一個表達式設置為用戶 ID 的哈希值。這允許您為每個CounterID和偽隨機化表中的數據EventDate如果您在選擇數據時定義了SAMPLE子句,ClickHouse 將為一部分用戶返回一個均勻的偽隨機數據樣本。

  該index_granularity設置可以省略,因為 8192 是默認值。

 

 

以下為不推薦使用的創建表的方法

!!!注意 “注意” 不要在新項目中使用此方法。如果可能,將舊項目切換到上述方法。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity)

 

MergeTree() 參數

  • date-column— Date類型的列的名稱。ClickHouse 根據該列自動按月創建分區。分區名稱采用"YYYYMM"格式。
  • sampling_expression— 抽樣表達式。
  • (primary, key)- 首要的關鍵。類型:元組()
  • index_granularity— 索引的粒度。索引“標記”之間的數據行數。值 8192 適用於大多數任務。

  例子

MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192)
 

  引擎的MergeTree配置方式與上面示例中的主引擎配置方法相同。

 


免責聲明!

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



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