Clickhouse INSERT操作

时间:2024-11-10 07:19:25
创建表: CREATE TABLE city ( `id` UInt8, `country` String, `province` String, `city` String, `create_time` datetime DEFAULT now() ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY id Ok. 0 rows in set. Elapsed: 0.012 sec. 插入数据: 1.单行插入: Clickhouse> insert into city(id,country,province,city) VALUES(1,'China','Hubei','wuhan'); INSERT INTO city (id, country, province, city) VALUES Ok. 1 rows in set. Elapsed: 0.017 sec. 2.多行插入: Clickhouse> insert into city(id,country,province,city) VALUES(2,'China','Hubei','xiangyang'),(2,'China','Guangdong','shenzhen'); INSERT INTO city (id, country, province, city) VALUES Ok. 2 rows in set. Elapsed: 0.002 sec. 插入特定格式: 比如CSV 或者 TSV JSON 等 insert into city select 20,'China','Beijing','Beijing','2020-06-24 14:15:00'; 虽然VALUES和SELECT字句支持声明表达式或者函数,但是会带来额外的性能开销,导致写入性能的下降。 若为了极致的性能需要尽可能避免使用他们。 INSERT语句在写入的过程具有原子性,在默认的情况下,每个数据块最多可以写入1048576行数据,有参数 max_insert_block_size参数控制,若INSERT操作写max_insert_block_size行的话要么成功要么失败。 需要注意的是只有在Clickhouse服务器端处理数据的时候才有写入特性。 在适用JDBC或者HTTP接口的时候。 因为max_insert_block_size在适用CLI或者insert select子句的时候不生效。 性能考虑: INSERT通过主键对输入数据进行排序,并通过分区键将它们划分为多个分区。 如果您一次将数据插入多个分区, 则可能会大大降低INSERT查询的性能。 为了避免这种情况: 批量添加数据,例如一次添加100,000行。 在将数据上传到ClickHouse之前,通过分区键对数据进行分组。 在以下情况下,性能不会降低: 数据是实时添加的。 您上传的数据通常按时间排序