云服务器内容精选

  • 使用示例 建表样例: CREATE TABLE default.upsert_tab ON CLUSTER default_cluster ( `id` Int32, `pdate` Date, `name` String )ENGINE = ReplicatedMergeTree('/clickhouse/tables/default/{shard}/upsert_tab', '{replica}') PARTITION BY toYYYYMM(pdate) PRIMARY KEY id ORDER BY id SETTINGS index_granularity = 8192; Upsert数据去重写入: Upsert into upsert_tab(id, pdate, name) values (1, rand() % 365, 'abc'), (2, rand() % 365, 'bcd'), (1, rand() % 365, 'def'); 查询test_upsert表数据 select * from upsert_tab; ┌─id─┬───pdate─┬─name─┐ │ 2 │ 1970-06-09│ bcd │ │ 1 │ 1970-11-30│ def │ └───┴── ────┴────┘ Upsert支持事务 与其他SQL语法类型一样,upsert语法也支持显式和隐式事务,使用事务前需要进行相应的事务功能开启配置。
  • 基本语法 方法一:使用INSERT VALUES方式进行数据写入。 UPSERT INTO [database_name.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ... 方法二:使用INSERT SELECT方式进行数据写入。 UPSERT INTO [database_name.]table [(c1, c2, c3)] SELECT ...
  • 注意事项 MergeTree和ReplicatedMergeTree建表要指定primary key或order by字段作为去重唯一键。如果未指定主键,只指定了order by建表属性,去重键以order by字段为准。 数据去重的key需要提前在应用中进行sharding计算,保证相同的key会sharding到同一个shard,才能保证后续相同的key字段数据sharding到同一个shard进行数据的精确去重。
  • 使用示例 --在default数据库和default_cluster集群下创建名为test表 CREATE TABLE default.test ON CLUSTER default_cluster ( `EventDate` DateTime, `id` UInt64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id
  • 基本语法 方法一:在指定的“database_name”数据库中创建一个名为“table_name ”的表。 如果建表语句中没有包含“database_name”,则默认使用客户端登录时选择的数据库作为数据库名称。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = engine_name() [PARTITION BY expr_list] [ORDER BY expr_list] ClickHouse在创建表时建议携带PARTITION BY创建表分区。因为ClickHouse数据迁移工具是基于表的分区作数据迁移,在创建表时如果不携带PARTITION BY创建表分区,则在集群内ClickHouseServer节点间数据迁移界面无法对该表进行数据迁移。 方法二:创建一个与database_name2.table_name2具有相同结构的表,同时可以对其指定不同的表引擎声明。 如果没有表引擎声明,则创建的表将与database_name2.table_name2使用相同的表引擎。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name AS [database_name2.]table_name2 [ENGINE = engine_name] 方法三:使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name ENGINE = engine_name AS SELECT ...
  • 使用示例 --查询表t1的表结构 desc t1; ┌─name────┬─type─┬─default_type─┬─default_expression ┬─comment─┬─codec_expression─┬─ttl_expression─┐ │ id │ UInt8 │ │ │ │ │ │ │ name │ UInt8 │ │ │ │ │ │ │ address │ String │ │ │ │ │ │ └───────┴────┴────────┴────────── ┴───── ┴──────────┴─────────┘
  • 注意事项 已删除的行会立即标记为已删除,并将自动从所有后续查询中过滤掉。数据清理在后台异步发生。此功能仅适用于MergeTree表引擎系列; 当前能力只支持本地表和复制表的轻量化删除功能,分布式表暂不支持。 数据删除功能的执行性能还依赖merge和mutation(alter table update/delete)任务的多少。queue队列中的mutation任务优先级最低(同一个表上的mutation任务是串行执行的),能并行执行多少个delete任务直接受merge任务执行情况的影响。 表中part个数也决定了轻量化删除的性能,part越多,删除越慢。 Wide part格式文件删除会更快,Compact格式文件删除性能会更慢一些,因为所有列数据都存储在一个文件中。
  • ALTER TABLE修改表数据 建议慎用delete、update的mutation操作 标准SQL的更新、删除操作是同步的,即客户端要等服务端返回执行结果(通常是int值);而ClickHouse的update、delete是通过异步方式实现的,当执行update语句时,服务端立即返回执行成功还是失败结果,但是实际上此时数据还没有修改完成,而是在后台排队等着进行真正的修改,可能会出现操作覆盖的情况,也无法保证操作的原子性。 业务场景要求有update、delete等操作,建议使用ReplacingMergeTree、CollapsingMergeTree、VersionedCollapsingMergeTree引擎,使用方式参见:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree/。 建议少或不增删数据列 业务提前规划列个数,如果将来有更多列要使用,可以规划预留多列,避免在生产系统跑业务过程中进行大量的alter table modify列操作,导致不可以预知的性能、数据一致性问题。 父主题: ClickHouse常用SQL语法
  • 使用示例 --在default数据库和default_cluster集群下创建名为test表 CREATE TABLE default.test ON CLUSTER default_cluster ( `EventDate` DateTime, `id` UInt64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY id
  • 基本语法 方法一:在指定的“database_name”数据库中创建一个名为“table_name ”的表。 如果建表语句中没有包含“database_name”,则默认使用客户端登录时选择的数据库作为数据库名称。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name [ON CLUSTER ClickHouse集群名] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = engine_name() [PARTITION BY expr_list] [ORDER BY expr_list] ClickHouse在创建表时建议携带PARTITION BY创建表分区。因为ClickHouse数据迁移工具是基于表的分区进行数据迁移,在创建表时如果不携带PARTITION BY创建表分区,则在集群内ClickHouseServer节点间数据迁移界面无法对该表进行数据迁移。 方法二:创建一个与database_name2.table_name2具有相同结构的表,同时可以对其指定不同的表引擎声明。 如果没有表引擎声明,则创建的表将与database_name2.table_name2使用相同的表引擎。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name AS [database_name2.]table_name2 [ENGINE = engine_name] 方法三:使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。 CREATE TABLE [IF NOT EXISTS] [database_name.]table_name ENGINE = engine_name AS SELECT ...