Clickhouse INSERT操作

本文详细介绍ClickHouse数据库中高效插入数据的方法,包括单行、多行插入及使用特定格式如CSV、TSV、JSON等。文章强调了性能考虑因素,如通过主键排序和分区键分组数据的重要性,以及如何避免性能下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建表:
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之前,通过分区键对数据进行分组。

在以下情况下,性能不会降低:

数据是实时添加的。
您上传的数据通常按时间排序


 

参考:

https://www.altinity.com/blog/2018/10/16/updates-in-clickhouse

https://clickhouse.tech/docs/en/sql-reference/statements/insert-into/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值