version=19.4

    https://clickhouse.yandex/docs/v19.4/en/operations/table_engines/mergetree/

    主键越多影响插入时的性能和内存消耗,但不影响查询性能

    主键与分片键的关系

    • 主键用于在同一个分片内的排序
    • 分片键决定数据在哪个分片

    数据粒度:创建索引时每个标记(mark)之间的数据数量,每个固定数据粒度会有一个标记。比如100个数据,数据粒度是10,则每隔10个数据会有一个标记

    主键与排序列之间的关系
    - 主键首先排序再按照排序列排序

    本地表与分布式表
    - 只在当前服务器创建。需要在所有服务器都创建才能在所有服务器都有效。通常用_local后缀标记本地表,但不强制
    - 在本地表基础上创建的表,本身不存储数据,用于路由与合并。通常用_all后缀标记分布式表,但不强制

    • 命令行方式执行脚本文件
      clickhouse-client —host=$HOSTNAME —port=53090 —multiquery < createtable.new.sql
      clickhouse-client —port=53090 —mn < createtable.new.sql

    • 导入csv数据,指定分隔符
      clickhouse-client —format_csv_delimiter=”|” —query=“INSERT INTO test.csv FORMAT CSV” < data.csv

    脚本文件中“—”表示注释

    • ReplacingMergeTree 表引擎,会删除相同主键的数据
      1.只能根据主键去重。
      2.去重的时候只会去重相同分区的数据,跨分区不会去重,即使是使用 OPTIMIZE TABLE table1 FINAL 也不会跨分区去重。
      如果一定要使用这个特性去重,只能将需要去重的数据放在同一个分区。(分区键为主键之一的时候不存在这个问题)
      https://www.jianshu.com/p/a5bf490247ea

    • OPTIMIZE语法
      OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition] [FINAL]
      initializes a non-scheduled merge of data parts
      If you specify FINAL , optimization will be performed even when all the data is already in one part
      - 对本地表有效,对分布式表无效,但可以通过 ON CLUSTER cluster使整个集群有效

    • 删除指定分区
      ALTER TABLE tablex [ON CLUSTER rpp] drop partition toYYYYMMDD(toDate(‘2019-07-11’));
      ALTER TABLE tablex [ON CLUSTER rpp] drop partition 20190711;
      - 对本地表有效,对分布式表无效,但可以通过 ON CLUSTER cluster使整个集群有效

    • 如何去重
      - 使用ReplacingMergeTree引擎
      - 分片字段必须包含在主键中
      - sharding key表达式必须与分片表达式一致(optimize只能在相同shard中根据主键去重)
      为了一致,需要尽量将分片的表达式表示成整数,因为分布式表中的sharding_key只支持整数
      - 重跑作业完成后必须对生成数据所在的分片进行optimize去重
      - 查询数据方可以使用optimize语句针对所要查询的分片进行去重【可选,但是不建议】
      - Distributed(remote_group, database, table [, sharding_key]) 创建分布式表时,sharding_key不能用随机数表示,需要用主键中的列表示才能将相同主键的数据保存到相同的shard

    数组格式(arr Array(String))需要用单引号: [‘a’,’b’,’c’]
    数组格式(arr Array(UInt8))需要用单引号: [1,2,3]
    数组格式(arr Nested(x String,y UInt8): [‘a’,’b’] [1,2] —- 相当与定义了两个数据arr.x arr.y,但是两个数据的大小必须一样