一、ClickHouse SQL 语句
语句表示可以使用 SQL 查询执行的各种操作。每种类型的语句都有自己的语法和用法详细信息,这些语法和用法详细信息单独描述如下所示:
1、SELECT
SELECT
语法
[WITH expr_list|(subquery)]
SELECT [DISTINCT] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[UNION ALL ...]
[INTO OUTFILE filename]
[FORMAT format]
所有子句都是可选的,但紧接在 SELECT 后面的必需表达式列表除外,更详细的请看 下面.
每个可选子句的具体内容在单独的部分中进行介绍,这些部分按与执行顺序相同的顺序列出:
• WITH 子句
• FROM 子句
• SAMPLE 子句
• JOIN 子句
• PREWHERE 子句
• WHERE 子句
• GROUP BY 子句
• LIMIT BY 子句
• HAVING 子句
• SELECT 子句
• DISTINCT 子句
• LIMIT 子句
• UNION ALL 子句
• INTO OUTFILE 子句
• FORMAT 子句
SELECT 子句
表达式 指定 SELECT 子句是在上述子句中的所有操作完成后计算的。 这些表达式的工作方式就好像它们应用于结果中的单独行一样。 如果表达式 SELECT
如果在结果中包含所有列,请使用星号 (*)符号。 例如, SELECT * FROM ....
将结果中的某些列与 re2 正则表达式匹配,可以使用 COLUMNS
COLUMNS('regexp')
例如表:
CREATE TABLE default.col_names (aa Int8, ab Int8, bc Int8) ENGINE = TinyLog
以下查询所有列名包含 a
SELECT COLUMNS('a') FROM col_names
┌─aa─┬─ab─┐
│ 1 │ 1 │
└────┴────┘
所选列不按字母顺序返回。
您可以使用多个 COLUMNS
例如:
SELECT COLUMNS('a'), COLUMNS('c'), toTypeName(COLUMNS('c')) FROM col_names
┌─aa─┬─ab─┬─bc─┬─toTypeName(bc)─┐
│ 1 │ 1 │ 1 │ Int8 │
└────┴────┴────┴────────────────┘
返回的每一列 COLUMNS
例如:
SELECT COLUMNS('a') + COLUMNS('c') FROM col_names
Received exception from server (version 19.14.1):Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of arguments for function plus doesn't match: passed 3, should be 2.
该例子中, COLUMNS('a') 返回两列: aa 和 ab. COLUMNS('c') 返回 bc 列。 该 +
匹配的列 COLUMNS 表达式可以具有不同的数据类型。 如果 COLUMNS 不匹配任何列,并且是在 SELECT
星号
您可以在查询的任何部分使用星号替代表达式。进行查询分析、时,星号将展开为所有表的列(不包括 MATERIALIZED 和 ALIAS
- 创建转储表时。
- 对于只包含几列的表,例如系统表。
- 获取表中列的信息。 在这种情况下,设置 LIMIT 1. 但最好使用 DESC TABLE
- 当对少量列使用 PREWHERE
- 在子查询中(因为外部查询不需要的列从子查询中排除)。
在所有其他情况下,我们不建议使用星号,因为它只给你一个列DBMS的缺点,而不是优点。 换句话说,不建议使用星号。
极端值
除结果之外,还可以获取结果列的最小值和最大值。 要做到这一点,设置 extremes 设置为1。 最小值和最大值是针对数字类型、日期和带有时间的日期计算的。 对于其他类型列,输出默认值。分别的额外计算两行 – 最小值和最大值。 这额外的两行采用输出格式为 JSON*, TabSeparated*,和 Pretty* formats,与其他行分开。 它们不以其他格式输出。为 JSON* 格式时,极端值单独的输出在 extremes’ 字段。 为 TabSeparated* 格式时,此行来的主要结果集后,然后显示 ‘totals’ 字段。 它前面有一个空行(在其他数据之后)。 在 Pretty* 格式时,该行在主结果之后输出为一个单独的表,然后显示 ‘totals’ 字段。极端值在 LIMIT 之前被计算,但在 LIMIT BY 之后被计算. 然而,使用 LIMIT offset, size, offset 之前的行都包含在 extremes. 在流请求中,结果还可能包括少量通过 LIMIT
备注
您可以在查询的任何部分使用同义词 (AS
GROUP BY 和 ORDER BY 子句不支持位置参数。 这与MySQL相矛盾,但符合标准SQL。 例如, GROUP BY 1, 2
实现细节
如果查询省略 DISTINCT, GROUP BY , ORDER BY , IN , JOIN
- max_memory_usage
- max_rows_to_group_by
- max_rows_to_sort
- max_rows_in_distinct
- max_bytes_in_distinct
- max_rows_in_set
- max_bytes_in_set
- max_rows_in_join
- max_bytes_in_join
- max_bytes_before_external_sort
- max_bytes_before_external_group_by
有关详细信息,请参阅部分 “Settings”. 可以使用外部排序(将临时表保存到磁盘)和外部聚合。
2、INSERT INTO
INSERT INTO 语句
INSERT INTO 语句主要用于向系统中添加数据.
查询的基本格式:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
您可以在查询中指定要插入的列的列表,如:[(c1, c2, c3)]。您还可以使用列匹配器的表达式,例如*和/或修饰符,例如 APPLY, EXCEPT, REPLACE。
例如,考虑该表:
SHOW CREATE insert_select_testtable;
CREATE TABLE insert_select_testtable( `a` Int8, `b` String, `c` Int8)ENGINE = MergeTree()ORDER BY a
INSERT INTO insert_select_testtable (*) VALUES (1, 'a', 1) ;
如果要在除了'b'列以外的所有列中插入数据,您需要传递和括号中选择的列数一样多的值:
INSERT INTO insert_select_testtable (* EXCEPT(b)) Values (2, 2);
SELECT * FROM insert_select_testtable;
┌─a─┬─b─┬─c─┐
│ 2 │ │ 2 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
└───┴───┴───┘
在这个示例中,我们看到插入的第二行的a和c列的值由传递的值填充,而b列由默认值填充。
对于存在于表结构中但不存在于插入列表中的列,它们将会按照如下方式填充数据:
- 如果存在DEFAULT表达式,根据DEFAULT表达式计算被填充的值。
- 如果没有定义DEFAULT表达式,则填充零或空字符串。
如果 strict_insert_defaults=1,你必须在查询中列出所有没有定义DEFAULT表达式的列。
数据可以以ClickHouse支持的任何 输入输出格式 传递给INSERT。格式的名称必须显示的指定在查询中:
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name data_set
例如,下面的查询所使用的输入格式就与上面INSERT … VALUES的中使用的输入格式相同:
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...
ClickHouse会清除数据前所有的空白字符与一个换行符(如果有换行符的话)。所以在进行查询时,我们建议您将数据放入到输入输出格式名称后的新的一行中去(如果数据是以空白字符开始的,这将非常重要)。
示例:
INSERT INTO t FORMAT TabSeparated11 Hello, world!22 Qwerty
在使用命令行客户端或HTTP客户端时,你可以将具体的查询语句与数据分开发送。更多具体信息,请参考«客户端»部分。
限制
如果表中有一些限制,数据插入时会逐行进行数据校验,如果这里面包含了不符合限制条件的数据,服务将会抛出包含限制信息的异常,这个语句也会被停止执行。
使用SELECT的结果写入
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
写入与SELECT的列的对应关系是使用位置来进行对应的,尽管它们在SELECT表达式与INSERT中的名称可能是不同的。如果需要,会对它们执行对应的类型转换。
除了VALUES格式之外,其他格式中的数据都不允许出现诸如now(),1 + 2等表达式。VALUES格式允许您有限度的使用这些表达式,但是不建议您这么做,因为执行这些表达式总是低效的。
系统不支持的其他用于修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。 但是,您可以使用 ALTER TABLE ... DROP PARTITION查询来删除一些旧的数据。
如果 SELECT 查询中包含了 input() 函数,那么 FORMAT
如果某一列限制了值不能是NULL,那么插入NULL的时候就会插入这个列类型的默认数据,可以通过设置 insert_null_as_default 插入NULL。
从文件向表中插入数据
INSERT INTO [db.]table [(c1, c2, c3)] FROM INFILE file_name [COMPRESSION type] FORMAT format_name
使用上面的语句可以从客户端的文件上读取数据并插入表中,file_name 和 type 都是 String 类型,输入文件的格式 一定要在 FORMAT
支持读取压缩文件。默认会去读文件的拓展名作为文件的压缩方式,或者也可以在 COMPRESSION 语句中指明,支持的文件压缩格式如下:'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'。
这个功能在 command-line client 和 clickhouse-local 是可用的。
样例
echo 1,A > input.csv ; echo 2,B >> input.csv
clickhouse-client --query="CREATE TABLE table_from_file (id UInt32, text String) ENGINE=MergeTree() ORDER BY id;"
clickhouse-client --query="INSERT INTO table_from_file FROM INFILE 'input.csv' FORMAT CSV;"
clickhouse-client --query="SELECT * FROM table_from_file FORMAT PrettyCompact;"
结果:
┌─id─┬─text─┐
│ 1 │ A │
│ 2 │ B │
└────┴──────┘
插入表函数
数据可以通过 table functions 方法插入。
INSERT INTO [TABLE] FUNCTION table_func ...
例如
可以这样使用remote 表函数:
CREATE TABLE simple_table (id UInt32, text String) ENGINE=MergeTree() ORDER BY id;INSERT INTO TABLE FUNCTION remote('localhost', default.simple_table) VALUES (100, 'inserted via remote()');SELECT * FROM simple_table;
结果:
┌──id─┬─text──────────────────┐
│ 100 │ inserted via remote() │
└─────┴───────────────────────┘
性能的注意事项
在进行INSERT时将会对写入的数据进行一些处理,按照主键排序,按照月份对数据进行分区等。所以如果在您的写入数据中包含多个月份的混合数据时,将会显著的降低INSERT的性能。为了避免这种情况:
- 数据总是以尽量大的batch进行写入,如每次写入100,000行。
- 数据在写入ClickHouse前预先的对数据进行分组。
在以下的情况下,性能不会下降:
- 数据总是被实时的写入。
- 写入的数据已经按照时间排序。
也可以异步的、小规模的插入数据,这些数据会被合并成多个批次,然后安全地写入到表中,通过设置async_insert,可以使用异步插入的方式,请注意,异步插入的方式只支持HTTP协议,并且不支持数据去重。
3、CREATE
CREATE DATABASE
该查询用于根据指定名称创建数据库。
CREATE DATABASE [IF NOT EXISTS] db_name
数据库其实只是用于存放表的一个目录。 如果查询中存在IF NOT EXISTS,则当数据库已经存在时,该查询不会返回任何错误。
CREATE TABLE
对于CREATE TABLE,存在以下几种方式。
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ...) ENGINE = engine
在指定的’db’数据库中创建一个名为’name’的表,如果查询中没有包含’db’,则默认使用当前选择的数据库作为’db’。后面的是包含在括号中的表结构以及表引擎的声明。 其中表结构声明是一个包含一组列描述声明的组合。如果表引擎是支持索引的,那么可以在表引擎的参数中对其进行说明。
在最简单的情况下,列描述是指名称 类型这样的子句。例如: RegionID UInt32。 但是也可以为列另外定义默认值表达式(见后文)。
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
创建一个与db2.name2具有相同结构的表,同时你可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。
CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT ...
使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。
以上所有情况,如果指定了IF NOT EXISTS,那么在该表已经存在的情况下,查询不会返回任何错误。在这种情况下,查询几乎不会做任何事情。
在ENGINE子句后还可能存在一些其他的子句,更详细的信息可以参考 表引擎 中关于建表的描述。
默认值
在列描述中你可以通过以下方式之一为列指定默认表达式:DEFAULT expr,MATERIALIZED expr,ALIAS expr。 示例:URLDomain String DEFAULT domain(URL)。
如果在列描述中未定义任何默认表达式,那么系统将会根据类型设置对应的默认值,如:数值类型为零、字符串类型为空字符串、数组类型为空数组、日期类型为’1970-01-01’以及时间类型为 zero unix timestamp。
如果定义了默认表达式,则可以不定义列的类型。如果没有明确的定义类的类型,则使用默认表达式的类型。例如:EventDate DEFAULT toDate(EventTime)
如果同时指定了默认表达式与列的类型,则将使用类型转换函数将默认表达式转换为指定的类型。例如:Hits UInt32 DEFAULT 0与Hits UInt32 DEFAULT toUInt32(0)意思相同。
默认表达式可以包含常量或表的任意其他列。当创建或更改表结构时,系统将会运行检查,确保不会包含循环依赖。对于INSERT, 它仅检查表达式是否是可以解析的 - 它们可以从中计算出所有需要的列的默认值。
DEFAULT expr
普通的默认值,如果INSERT中不包含指定的列,那么将通过表达式计算它的默认值并填充它。
MATERIALIZED expr
物化表达式,被该表达式指定的列不能包含在INSERT的列表中,因为它总是被计算出来的。 对于INSERT而言,不需要考虑这些列。 另外,在SELECT查询中如果包含星号,此列不会被用来替换星号,这是因为考虑到数据转储,在使用SELECT *查询出的结果总能够被’INSERT’回表。
ALIAS expr
别名。这样的列不会存储在表中。 它的值不能够通过INSERT写入,同时使用SELECT查询星号时,这些列也不会被用来替换星号。 但是它们可以显示的用于SELECT中,在这种情况下,在查询分析中别名将被替换。
当使用ALTER查询对添加新的列时,不同于为所有旧数据添加这个列,对于需要在旧数据中查询新列,只会在查询时动态计算这个新列的值。但是如果新列的默认表示中依赖其他列的值进行计算,那么同样会加载这些依赖的列的数据。
如果你向表中添加一个新列,并在之后的一段时间后修改它的默认表达式,则旧数据中的值将会被改变。请注意,在运行后台合并时,缺少的列的值将被计算后写入到合并后的数据部分中。
不能够为nested类型的列设置默认值。
制约因素
随着列描述约束可以定义:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1], ... CONSTRAINT constraint_name_1 CHECK boolean_expr_1, ...) ENGINE = engine
boolean_expr_1 可以通过任何布尔表达式。 如果为表定义了约束,则将为表中的每一行检查它们中的每一行 INSERT
添加大量的约束会对big的性能产生负面影响 INSERT
Ttl表达式
定义值的存储时间。 只能为MergeTree系列表指定。 有关详细说明,请参阅 列和表的TTL.
列压缩编解ecs
默认情况下,ClickHouse应用以下定义的压缩方法 服务器设置,列。 您还可以定义在每个单独的列的压缩方法 CREATE TABLE
CREATE TABLE codec_example( dt Date CODEC(ZSTD), ts DateTime CODEC(LZ4HC), float_value Float32 CODEC(NONE), double_value Float64 CODEC(LZ4HC(9)) value Float32 CODEC(Delta, ZSTD))ENGINE = <Engine>...
专业编解ecs
这些编解码器旨在通过使用数据的特定功能使压缩更有效。 其中一些编解码器不压缩数据本身。 相反,他们准备的数据用于共同目的的编解ec,其压缩它比没有这种准备更好。
专业编解ecs:
- Delta(delta_bytes) — Compression approach in which raw values are replaced by the difference of two neighboring values, except for the first value that stays unchanged. Up to delta_bytes 用于存储增量值,所以 delta_bytes 是原始值的最大大小。 可能 delta_bytes 值:1,2,4,8. 默认值 delta_bytes 是 sizeof(type)
- DoubleDelta — Calculates delta of deltas and writes it in compact binary form. Optimal compression rates are achieved for monotonic sequences with a constant stride, such as time series data. Can be used with any fixed-width type. Implements the algorithm used in Gorilla TSDB, extending it to support 64-bit types. Uses 1 extra bit for 32-byte deltas: 5-bit prefixes instead of 4-bit prefixes. For additional information, see Compressing Time Stamps in Gorilla:一个快速、可扩展的内存时间序列数据库.
- Gorilla — Calculates XOR between current and previous value and writes it in compact binary form. Efficient when storing a series of floating point values that change slowly, because the best compression rate is achieved when neighboring values are binary equal. Implements the algorithm used in Gorilla TSDB, extending it to support 64-bit types. For additional information, see Compressing Values in Gorilla:一个快速、可扩展的内存时间序列数据库.
- T64 — Compression approach that crops unused high bits of values in integer data types (including Enum, Date 和 DateTime). 在算法的每个步骤中,编解码器采用64个值块,将它们放入64x64位矩阵中,对其进行转置,裁剪未使用的值位并将其余部分作为序列返回。 未使用的位是使用压缩的整个数据部分的最大值和最小值之间没有区别的位。
DoubleDelta 和 Gorilla 编解码器在Gorilla TSDB中用作其压缩算法的组件。 大猩猩的方法是有效的情况下,当有缓慢变化的值与他们的时间戳序列。 时间戳是由有效地压缩 DoubleDelta 编解ec,和值有效地由压缩 Gorilla
CREATE TABLE codec_example( timestamp DateTime CODEC(DoubleDelta), slow_values Float32 CODEC(Gorilla))ENGINE = MergeTree()
通用编解ecs
编解ecs:
- NONE
- LZ4 — Lossless 数据压缩算法 默认情况下使用。 应用LZ4快速压缩。
- LZ4HC[(level)] — LZ4 HC (high compression) algorithm with configurable level. Default level: 9. Setting level <= 0
- ZSTD[(level)] — ZSTD压缩算法 可配置 level. 可能的水平:[1,22]。 默认值:1。
高压缩级别对于非对称场景非常有用,例如压缩一次,重复解压缩。 更高的级别意味着更好的压缩和更高的CPU使用率。
临时表
ClickHouse支持临时表,其具有以下特征:
- 当回话结束时,临时表将随会话一起消失,这包含链接中断。
- 临时表仅能够使用Memory表引擎。
- 无法为临时表指定数据库。它是在数据库之外创建的。
- 如果临时表与另一个表名称相同,那么当在查询时没有显示的指定db的情况下,将优先使用临时表。
- 对于分布式处理,查询中使用的临时表将被传递到远程服务器。
可以使用下面的语法创建一个临时表:
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ...)
大多数情况下,临时表不是手动创建的,只有在分布式查询处理中使用(GLOBAL) IN时为外部数据创建。更多信息,可以参考相关章节。
分布式DDL查询 (ON CLUSTER 子句)
对于 CREATE, DROP, ALTER,以及RENAME查询,系统支持其运行在整个集群上。 例如,以下查询将在cluster集群的所有节点上创建名为all_hits的Distributed表:
CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits)
为了能够正确的运行这种查询,每台主机必须具有相同的cluster声明(为了简化配置的同步,你可以使用zookeeper的方式进行配置)。同时这些主机还必须链接到zookeeper服务器。 这个查询将最终在集群的每台主机上运行,即使一些主机当前处于不可用状态。同时它还保证了所有的查询在单台主机中的执行顺序。
CREATE VIEW
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
创建一个视图。它存在两种可选择的类型:普通视图与物化视图。
普通视图不存储任何数据,只是执行从另一个表中的读取。换句话说,普通视图只是保存了视图的查询,当从视图中查询时,此查询被作为子查询用于替换FROM子句。
举个例子,假设你已经创建了一个视图:
CREATE VIEW view AS SELECT ...
还有一个查询:
SELECT a, b, c FROM view
这个查询完全等价于:
SELECT a, b, c FROM (SELECT ...)
物化视图存储的数据是由相应的SELECT查询转换得来的。
在创建物化视图时,你还必须指定表的引擎 - 将会使用这个表引擎存储数据。
目前物化视图的工作原理:当将数据写入到物化视图中SELECT子句所指定的表时,插入的数据会通过SELECT子句查询进行转换并将最终结果插入到视图中。
如果创建物化视图时指定了POPULATE子句,则在创建时将该表的数据插入到物化视图中。就像使用CREATE TABLE ... AS SELECT ...一样。否则,物化视图只会包含在物化视图创建后的新写入的数据。我们不推荐使用POPULATE,因为在视图创建期间写入的数据将不会写入其中。
当一个SELECT子句包含DISTINCT, GROUP BY, ORDER BY, LIMIT时,请注意,这些仅会在插入数据时在每个单独的数据块上执行。例如,如果你在其中包含了GROUP BY,则只会在查询期间进行聚合,但聚合范围仅限于单个批的写入数据。数据不会进一步被聚合。但是当你使用一些其他数据聚合引擎时这是例外的,如:SummingMergeTree。
目前对物化视图执行ALTER是不支持的,因此这可能是不方便的。如果物化视图是使用的TO [db.]name的方式进行构建的,你可以使用DETACH语句先将视图剥离,然后使用ALTER运行在目标表上,然后使用ATTACH将之前剥离的表重新加载进来。
视图看起来和普通的表相同。例如,你可以通过SHOW TABLES查看到它们。
没有单独的删除视图的语法。如果要删除视图,请使用DROP TABLE。
CREATE DICTIONARY
CREATE DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster]
(
key1 type1 [DEFAULT|EXPRESSION expr1] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID],
key2 type2 [DEFAULT|EXPRESSION expr2] [HIERARCHICAL|INJECTIVE|IS_OBJECT_ID],
attr1 type2 [DEFAULT|EXPRESSION expr3],
attr2 type2 [DEFAULT|EXPRESSION expr4]
)
PRIMARY KEY key1, key2
SOURCE(SOURCE_NAME([param1 value1 ... paramN valueN]))
LAYOUT(LAYOUT_NAME([param_name param_value]))
LIFETIME({MIN min_val MAX max_val | max_val})
4、ALTER
ALTER 仅支持 *MergeTree ,Merge以及Distributed等引擎表。 该操作有多种形式。
列操作
改变表结构:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|CLEAR|COMMENT|MODIFY COLUMN ...
在语句中,配置一个或多个用逗号分隔的动作。每个动作是对某个列实施的操作行为。
支持下列动作:
- ADD COLUMN — 添加列
- DROP COLUMN — 删除列
- CLEAR COLUMN — 重置列的值
- COMMENT COLUMN — 给列增加注释说明
- MODIFY COLUMN — 改变列的值类型,默认表达式以及TTL
这些动作将在下文中进行详述。
增加列
ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after]
使用指定的name, type, codec 以及 default_expr (请参见 Default expressions),往表中增加新的列。
如果sql中包含 IF NOT EXISTS ,执行语句时如果列已经存在,CH不会报错。如果指定AFTER name_after(表中另一个列的名称),则新的列会加在指定列的后面。否则,新的列将被添加到表的末尾。注意,不能将新的列添加到表的开始位置, name_after
添加列仅仅是改变原有表的结构不会对已有数据产生影响。执行完 ALTER后磁盘中也不会出现新的数据。如果查询表时列的数据为空,那么CH会使用列的默认值来进行填充(如果有默认表达式,则使用这个;或者用0或空字符串)。当数据块完成合并(参见MergeTree)后,磁盘中会出现该列的数据。
这种方式允许 ALTER
示例:
ALTER TABLE visits ADD COLUMN browser String AFTER user_id
删除列
DROP COLUMN [IF EXISTS] name
通过指定 name删除列。如果语句包含 IF EXISTS,执行时遇到不存在的列也不会报错。
从文件系统中删除数据。由于是删除列的整个文件,该语句几乎是立即执行完成的。
示例:
ALTER TABLE visits DROP COLUMN browser
清空列
CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name
重置指定分区中列的值。 分区名称 partition_name 请参见 怎样设置分区表达式
如果语句中包含 IF EXISTS
示例:
ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple()
增加注释
COMMENT COLUMN [IF EXISTS] name 'comment'
给列增加注释说明。如果语句中包含 IF EXISTS
每个列都可以包含注释。如果列的注释已经存在,新的注释会替换旧的。 注释信息保存在 DESCRIBE TABLE查询的 comment_expression
示例:
ALTER TABLE visits COMMENT COLUMN browser 'The table shows the browser used for accessing the site.'
修改列
MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [TTL]
该语句可以改变 name
- Type
- Default expression
- TTL
有关修改列TTL的示例,请参见 Column TTL.
如果语句中包含 IF EXISTS
当改变列的类型时,列的值也被转换了,如同对列使用 toType函数一样。如果只改变了默认表达式,该语句几乎不会做任何复杂操作,并且几乎是立即执行完成的。
示例:
ALTER TABLE visits MODIFY COLUMN browser Array(String)
改变列的类型是唯一的复杂型动作 - 它改变了数据文件的内容。对于大型表,执行起来要花费较长的时间。 该操作分为如下处理步骤:
- 为修改的数据准备新的临时文件
- 重命名原来的文件
- 将新的临时文件改名为原来的数据文件名
- 删除原来的文件
仅仅在第一步是耗费时间的。如果该阶段执行失败,那么数据没有变化。如果执行后续的步骤中失败了,数据可以手动恢复。例外的情形是,当原来的文件从文件系统中被删除了,但是新的数据没有写入到临时文件中并且丢失了。
列操作的 ALTER行为是可以被复制的。这些指令会保存在ZooKeeper中,这样每个副本节点都能执行它们。所有的 ALTER
ALTER 操作限制
ALTER 操作允许在嵌套的数据结构中创建和删除单独的元素(列),但是不是整个嵌套结构。添加一个嵌套数据结构的列时,你可以用类似这样的名称 name.nested_name 及类型 Array(T)
不支持对primary key或者sampling key中的列(在 ENGINE 表达式中用到的列)进行删除操作。改变包含在primary key中的列的类型时,如果操作不会导致数据的变化(例如,往Enum中添加一个值,或者将DateTime 类型改成 UInt32),那么这种操作是可行的。
如果 ALTER 操作不足以完成你想要的表变动操作,你可以创建一张新的表,通过 INSERT SELECT将数据拷贝进去,然后通过 RENAME将新的表改成和原有表一样的名称,并删除原有的表。你可以使用 clickhouse-copier 代替 INSERT SELECT。
ALTER 操作会阻塞对表的所有读写操作。换句话说,当一个大的 SELECT 语句和 ALTER同时执行时,ALTER会等待,直到 SELECT 执行结束。与此同时,当 ALTER
对于不存储数据的表(例如 Merge 及 Distributed 表), ALTER 仅仅改变了自身的表结构,不会改变从属的表结构。例如,对 Distributed
key表达式的修改
支持下列表达式:
MODIFY ORDER BY new_expression
该操作仅支持 MergeTree 系列表 (含 replicated 表)。它会将表的 排序键变成 new_expression
该操作是轻量级的,仅会改变元数据。
跳过索引来更改数据
该操作仅支持 MergeTree 系列表 (含 replicated 表)。 下列操作是允许的:
- ALTER TABLE [db].name ADD INDEX name expression TYPE type GRANULARITY value [FIRST|AFTER name]
- ALTER TABLE [db].name DROP INDEX name
由于只改变表的元数据或者删除文件,因此该操作是轻量级的,也可以被复制到其它节点(通过Zookeeper同步索引元数据)
更改约束
参见 constraints查看更多信息。
通过下面的语法,可以添加或删除约束:
ALTER TABLE [db].name ADD CONSTRAINT constraint_name CHECK expression;ALTER TABLE [db].name DROP CONSTRAINT constraint_name;
上述语句会从表中增加或删除约束的元数据,因此会被立即处理。 对已有数据的约束检查 将不会执行
对可复制表的操作可通过Zookeeper传播到其它副本节点。
更改分区及文件块
允许进行下列关于 partitions 的操作:
- DETACH PARTITION — 将分区数据移动到 detached
- DROP PARTITION — 删除一个partition.
- ATTACH PART|PARTITION — 将detached
- ATTACH PARTITION FROM — 从表中复制数据分区到另一张表,并添加分区
- REPLACE PARTITION — 从表中复制数据分区到其它表及副本
- MOVE PARTITION TO TABLE — 从表中复制数据分区到其它表.
- CLEAR COLUMN IN PARTITION — 重置分区中某个列的值
- CLEAR INDEX IN PARTITION — 重置分区中指定的二级索引
- FREEZE PARTITION — 创建分区的备份
- FETCH PARTITION — 从其它服务器上下载分
- MOVE PARTITION|PART — 将分区/数据块移动到另外的磁盘/卷
分区剥离
ALTER TABLE table_name DETACH PARTITION partition_expr
将指定分区的数据移动到 detached 目录。服务器会忽略被分离的数据分区。只有当你使用 ATTACH 时,服务器才会知晓这部分数据。
示例:
ALTER TABLE visits DETACH PARTITION 201901
从 如何设置分区表达式章节中获取分区表达式的设置说明。
当执行操作以后,可以对 detached
该操作是可以复制的,它会将所有副本节点上的数据移动到 detached 目录。注意仅能在副本的leader节点上执行该操作。想了解副本是否是leader节点,需要在 system.replicas 表执行 SELECT 操作。或者,可以很方便的在所有副本节点上执行 DETACH操作,但除leader外其它的副本节点会抛出异常。
删除分区
ALTER TABLE table_name DROP PARTITION partition_expr
从表中删除指定分区。该操作会将分区标记为不活跃的,然后在大约10分钟内删除全部数据。
在 如何设置分区表达式中获取分区表达式的设置说明。 该操作是可复制的,副本节点的数据也将被删除。
删除已剥离的分区|数据块
ALTER TABLE table_name DROP DETACHED PARTITION|PART partition_expr
从detached目录中删除指定分区的特定部分或所有数据。访问 如何设置分区表达式可获取设置分区表达式的详细信息。
关联分区|数据块
ALTER TABLE table_name ATTACH PARTITION|PART partition_expr
从detached目录中添加数据到数据表。可以添加整个分区的数据,或者单独的数据块。例如:
ALTER TABLE visits ATTACH PARTITION 201901;ALTER TABLE visits ATTACH PART 201901_2_2_0;
访问 如何设置分区表达式可获取设置分区表达式的详细信息。
该操作是可以复制的。副本启动器检查 detached目录是否有数据。如果有,该操作会检查数据的完整性。如果一切正常,该操作将数据添加到表中。其它副本节点通过副本启动器下载这些数据。
因此可以在某个副本上将数据放到 detached目录,然后通过 ALTER ... ATTACH
从...关联分区
ALTER TABLE table2 ATTACH PARTITION partition_expr FROM table1
该操作将 table1 表的数据分区复制到 table2 表的已有分区。注意table1表的数据不会被删除。
为保证该操作能成功运行,下列条件必须满足:
- 2张表必须有相同的结构
- 2张表必须有相同的分区键
替换分区
ALTER TABLE table2 REPLACE PARTITION partition_expr FROM table1
该操作将 table1 表的数据分区复制到 table2表,并替换 table2表的已有分区。注意table1表的数据不会被删除。
为保证该操作能成功运行,下列条件必须满足:
- 2张表必须有相同的结构
- 2张表必须有相同的分区键
将分区移动到表
ALTER TABLE table_source MOVE PARTITION partition_expr TO TABLE table_dest
该操作将 table_source表的数据分区移动到 table_dest表,并删除table_source表的数据。
为保证该操作能成功运行,下列条件必须满足:
- 2张表必须有相同的结构
- 2张表必须有相同的分区键
- 2张表必须属于相同的引擎系列(可复制表或不可复制表)
- 2张表必须有相同的存储方式
清空分区的列
ALTER TABLE table_name CLEAR COLUMN column_name IN PARTITION partition_expr
重置指定分区的特定列的值。如果建表时使用了 DEFAULT
示例:
ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902
冻结分区
ALTER TABLE table_name FREEZE [PARTITION partition_expr]
该操作为指定分区创建一个本地备份。如果 PARTITION
!!! 注意 "Note" 整个备份过程不需要停止服务
注意对于老式的表,可以指定分区名前缀(例如,‘2019’),然后该操作会创建所有对应分区的备份。访问 如何设置分区表达式可获取设置分区表达式的详细信息。
在执行操作的同时,对于数据快照,该操作会创建到表数据的硬链接。硬链接放置在 /var/lib/clickhouse/shadow/N/...,也就是:
- /var/lib/clickhouse/
- N
!!! 注意 "Note" 如果你使用 多个磁盘存储数据表, 那么每个磁盘上都有 shadow/N目录,用来保存PARTITION
备份内部也会创建和 /var/lib/clickhouse/
当备份创建完毕,你可以从 /var/lib/clickhouse/shadow/复制数据到远端服务器,然后删除本地数据。注意 ALTER t FREEZE PARTITION操作是不能复制的,它仅在本地服务器上创建本地备份。
该操作创建备份几乎是即时的(但是首先它会等待相关表的当前操作执行完成)
ALTER TABLE t FREEZE PARTITION 仅仅复制数据, 而不是元数据信息. 要复制表的元数据信息, 拷贝这个文件 /var/lib/clickhouse/metadata/database/table.sql
从备份中恢复数据,按如下步骤操作:
- 如果表不存在,先创建。 查看.sql 文件获取执行语句 (将ATTACH 替换成 CREATE).
- 从 备份的 data/database/table/目录中将数据复制到 /var/lib/clickhouse/data/database/table/detached/目录
- 运行 ALTER TABLE t ATTACH PARTITION操作,将数据添加到表中
恢复数据不需要停止服务进程。 想了解备份及数据恢复的更多信息,请参见 数据备份 。
删除分区的索引
ALTER TABLE table_name CLEAR INDEX index_name IN PARTITION partition_expr
该操作和 CLEAR COLUMN类似,但是它重置的是索引而不是列的数据。
获取分区
ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'path-in-zookeeper'
从另一服务器上下载分区数据。仅支持可复制引擎表。 该操作做了如下步骤:
- 从指定数据分片上下载分区。在 path-in-zookeeper 这一参数你必须设置Zookeeper中该分片的path值。
- 然后将已下载的数据放到 table_name 表的 detached 目录下。通过 ATTACH PARTITION|PART将数据加载到表中。
示例:
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits';ALTER TABLE users ATTACH PARTITION 201902;
注意:
- ALTER ... FETCH PARTITION 操作不支持复制,它仅在本地服务器上将分区移动到 detached目录。
- ALTER TABLE ... ATTACH操作是可复制的。它将数据添加到所有副本。数据从某个副本的detached
在开始下载之前,系统检查分区是否存在以及和表结构是否匹配。然后从健康的副本集中自动选择最合适的副本。
虽然操作叫做 ALTER TABLE,但是它并不能改变表结构,也不会立即改变表中可用的数据。
移动分区|数据块
将 MergeTree引擎表的分区或数据块移动到另外的卷/磁盘中。参见 使用多个块设备存储数据
ALTER TABLE table_name MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'
ALTER TABLE t MOVE
- 不支持复制,因为不同副本可以有不同的存储方式
- 如果指定的磁盘或卷没有配置,返回错误。如果存储方式中设定的数据移动条件不能满足,该操作同样报错。
- 这种情况也会报错:即将移动的数据已经由后台进程在进行移动操作时,并行的 ALTER TABLE t MOVE操作或者作为后台数据合并的结果。这种情形下用户不能任何额外的动作。
示例:
ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow'ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd'
如何设置分区表达式
通过不同方式在 ALTER ... PARTITION
- system.parts表 partition列的某个值,例如, ALTER TABLE visits DETACH PARTITION 201901
- 表的列表达式。支持常量及常量表达式。例如, ALTER TABLE visits DETACH PARTITION toYYYYMM(toDate('2019-01-25'))
- 使用分区ID。分区ID是字符串变量(可能的话有较好的可读性),在文件系统和ZooKeeper中作为分区名称。分区ID必须配置在 PARTITION ID中,用单引号包含,例如, ALTER TABLE visits DETACH PARTITION ID '201901'
- 在 ALTER ATTACH PART 和 DROP DETACHED PART 操作中,要配置块的名称,使用 system.detached_parts表中 name列的字符串值,例如: ALTER TABLE visits ATTACH PART '201901_1_1_0'
设置分区时,引号使用要看分区表达式的类型。例如,对于 String类型,需要设置用引号(')包含的名称。对于 Date 和 Int*引号就不需要了。 对于老式的表,可以用数值201901 或字符串 '201901'来设置分区。新式的表语法严格和类型一致(类似于VALUES输入的解析)
上述所有规则同样适用于 OPTIMIZE 操作。在对未分区的表进行 OPTIMIZE 操作时,如果需要指定唯一的分区,这样设置表达式PARTITION tuple()。例如:
OPTIMIZE TABLE table_not_partitioned PARTITION tuple() FINAL;
ALTER ... PARTITION 操作的示例在 00502_custom_partitioning_local 和 00502_custom_partitioning_replicated_zookeeper 提供了演示。
更改表的TTL
通过以下形式的请求可以修改 table TTL
ALTER TABLE table-name MODIFY TTL ttl-expression
ALTER操作的同步性
对于不可复制的表,所有 ALTER操作都是同步执行的。对于可复制的表,ALTER操作会将指令添加到ZooKeeper中,然后会尽快的执行它们。然而,该操作可以等待其它所有副本将指令执行完毕。
对于 ALTER ... ATTACH|DETACH|DROP操作,可以通过设置 alter_sync 来启用等待。可用参数值: 0 – 不需要等待; 1 – 仅等待自己执行(默认); 2
Mutations
Mutations是一类允许对表的行记录进行删除或更新的ALTER操作。相较于标准的 UPDATE 和 DELETE 用于少量行操作而言,Mutations用来对表的很多行进行重量级的操作。该操作支持 MergeTree系列表,包含支持复制功能的表。
已有的表已经支持mutations操作(不需要转换)。但是在首次对表进行mutation操作以后,它的元数据格式变得和和之前的版本不兼容,并且不能回退到之前版本。
目前可用的命令:
ALTER TABLE [db.]table DELETE WHERE filter_expr
filter_expr必须是 UInt8型。该操作将删除表中 filter_expr表达式值为非0的列
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
filter_expr必须是 UInt8型。该操作将更新表中各行 filter_expr表达式值为非0的指定列的值。通过 CAST
ALTER TABLE [db.]table MATERIALIZE INDEX name IN PARTITION partition_name
该操作更新 partition_name分区中的二级索引 name. 单次操作可以包含多个逗号分隔的命令。
对于 *MergeTree引擎表,mutation操作通过重写整个数据块来实现。没有原子性保证 - 被mutation操作的数据会被替换,在mutation期间开始执行的SELECT查询能看到所有已经完成mutation的数据,以及还没有被mutation替换的数据。
mutation总是按照它们的创建顺序来排序并以同样顺序在每个数据块中执行。mutation操作也会部分的和Insert操作一起排序 - 在mutation提交之前插入的数据会参与mutation操作,在mutation提交之后的插入的数据则不会参与mutation。注意mutation从来不会阻塞插入操作。
mutation操作在提交后(对于可复制表,添加到Zookeeper,对于不可复制表,添加到文件系统)立即返回。mutation操作本身是根据系统的配置参数异步执行的。要跟踪mutation的进度,可以使用系统表 system.mutations。已经成功提交的mutation操作在服务重启后仍会继续执行。一旦mutation完成提交,就不能回退了,但是如果因为某种原因操作被卡住了,可以通过 KILL MUTATION操作来取消它的执行。
已完成的mutations记录不会立即删除(要保留的记录数量由 finished_mutations_to_keep
修改用户
修改CH的用户账号
语法
ALTER USER [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] [IDENTIFIED [WITH {PLAINTEXT_PASSWORD|SHA256_PASSWORD|DOUBLE_SHA1_PASSWORD}] BY {'password'|'hash'}] [[ADD|DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...]
说明
要使用 ALTER USER,你必须拥有 ALTER USER 操作的权限
Examples
设置默认角色:
ALTER USER user DEFAULT ROLE role1, role2
如果角色之前没分配给用户,CH会抛出异常。
将所有分配的角色设为默认
ALTER USER user DEFAULT ROLE ALL
如果以后给用户分配了某个角色,它将自动成为默认角色
将除了 role1 和 role2之外的其它角色 设为默认
ALTER USER user DEFAULT ROLE ALL EXCEPT role1, role2
修改角色
修改角色.
语法
ALTER ROLE [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...]
修改row policy
修改row policy.
语法
ALTER [ROW] POLICY [IF EXISTS] name [ON CLUSTER cluster_name] ON [database.]table [RENAME TO new_name] [AS {PERMISSIVE | RESTRICTIVE}] [FOR SELECT] [USING {condition | NONE}][,...] [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]
修改配额quotas
修改配额quotas.
语法
ALTER QUOTA [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] [KEYED BY {'none' | 'user name' | 'ip address' | 'client key' | 'client key or user name' | 'client key or ip address'}] [FOR [RANDOMIZED] INTERVAL number {SECOND | MINUTE | HOUR | DAY | WEEK | MONTH | QUARTER | YEAR} {MAX { {QUERIES | ERRORS | RESULT ROWS | RESULT BYTES | READ ROWS | READ BYTES | EXECUTION TIME} = number } [,...] | NO LIMITS | TRACKING ONLY} [,...]] [TO {role [,...] | ALL | ALL EXCEPT role [,...]}]
修改settings配置
修改settings配置.
语法
ALTER SETTINGS PROFILE [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...]
5、SYSTEM
RELOAD EMBEDDED DICTIONARIES]
重新加载所有内置字典。默认情况下内置字典是禁用的。 总是返回 ‘OK.’,不管这些内置字典的更新结果如何。
RELOAD DICTIONARIES
重载已经被成功加载过的所有字典。 默认情况下,字典是延时加载的( dictionaries_lazy_load),不是在服务启动时自动加载,而是在第一次使用dictGet函数或通过 SELECT from tables with ENGINE = Dictionary 进行访问时被初始化。这个命令 SYSTEM RELOAD DICTIONARIES
RELOAD DICTIONARY Dictionary_name
完全重新加载指定字典 dictionary_name,不管该字典的状态如何(LOADED / NOT_LOADED / FAILED)。不管字典的更新结果如何,总是返回 OK. 字典的状态可以通过查询 system.dictionaries表来检查。
SELECT name, status FROM system.dictionaries;
DROP DNS CACHE
重置CH的dns缓存。有时候(对于旧的ClickHouse版本)当某些底层环境发生变化时(修改其它Clickhouse服务器的ip或字典所在服务器的ip),需要使用该命令。 更多自动化的缓存管理相关信息,参见disable_internal_dns_cache, dns_cache_update_period这些参数。
DROP MARK CACHE
重置mark缓存。在进行ClickHouse开发或性能测试时使用。
DROP REPLICA
使用下面的语句可以删除已经无效的副本。
SYSTEM DROP REPLICA 'replica_name' FROM TABLE database.table;SYSTEM DROP REPLICA 'replica_name' FROM DATABASE database;SYSTEM DROP REPLICA 'replica_name';SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/path/to/table/in/zk';
该操作将副本的路径从Zookeeper中删除。当副本失效,并且由于该副本已经不存在导致它的元数据不能通过 DROP TABLE从zookeeper中删除,这种情形下可以使用该命令。它只会删除失效或过期的副本,不会删除本地的副本。请使用 DROP TABLE 来删除本地副本。 DROP REPLICA
第1条语句:删除 database.table表的 replica_name副本的元数据 第2条语句:删除 database 数据库的 所有replica_name副本的元数据 第3条语句:删除本地服务器所有 replica_name副本的元数据 第4条语句:用于在表的其它所有副本都删除时,删除已失效副本的元数据。使用时需要明确指定表的路径。该路径必须和创建表时 ReplicatedMergeTree引擎的第一个参数一致。
DROP UNCOMPRESSED CACHE
重置未压缩数据的缓存。用于ClickHouse开发和性能测试。 管理未压缩数据缓存的参数,使用以下的服务器级别设置 uncompressed_cache_size以及 query/user/profile级别设置 use_uncompressed_cache
DROP COMPILED EXPRESSION CACHE
重置已编译的表达式缓存。用于ClickHouse开发和性能测试。 当 query/user/profile 启用配置项 compile-expressions时,编译的表达式缓存开启。
FLUSH LOGS
将日志信息缓冲数据刷入系统表(例如system.query_log)。调试时允许等待不超过7.5秒。当信息队列为空时,会创建系统表。
RELOAD CONFIG
重新加载ClickHouse的配置。用于当配置信息存放在ZooKeeper时。
SHUTDOWN
关闭ClickHouse服务(类似于 service clickhouse-server stop / kill {$pid_clickhouse-server})
KILL
关闭ClickHouse进程 ( kill -9 {$ pid_clickhouse-server})
Managing Distributed Tables
ClickHouse可以管理 distribute表。当用户向这类表插入数据时,ClickHouse首先为需要发送到集群节点的数据创建一个队列,然后异步的发送它们。你可以维护队列的处理过程,通过STOP DISTRIBUTED SENDS, FLUSH DISTRIBUTED, 以及 START DISTRIBUTED SENDS。你也可以设置 insert_distributed_sync参数来以同步的方式插入分布式数据。
STOP DISTRIBUTED SENDS
当向分布式表插入数据时,禁用后台的分布式数据分发。
SYSTEM STOP DISTRIBUTED SENDS [db.]<distributed_table_name>
FLUSH DISTRIBUTED
强制让ClickHouse同步向集群节点同步发送数据。如果有节点失效,ClickHouse抛出异常并停止插入操作。当所有节点都恢复上线时,你可以重试之前的操作直到成功执行。
SYSTEM FLUSH DISTRIBUTED [db.]<distributed_table_name>
START DISTRIBUTED SENDS
当向分布式表插入数据时,允许后台的分布式数据分发。
SYSTEM START DISTRIBUTED SENDS [db.]<distributed_table_name>
Managing MergeTree Tables
ClickHouse可以管理 MergeTree表的后台处理进程。
STOP MERGES
为MergeTree系列引擎表停止后台合并操作。
SYSTEM STOP MERGES [[db.]merge_tree_family_table_name]
!!! note "Note" DETACH / ATTACH
START MERGES
为MergeTree系列引擎表启动后台合并操作。
SYSTEM START MERGES [[db.]merge_tree_family_table_name]
STOP TTL MERGES
根据 TTL expression,为MergeTree系列引擎表停止后台删除旧数据。 不管表存在与否,都返回 OK.。当数据库不存在时返回错误。
SYSTEM STOP TTL MERGES [[db.]merge_tree_family_table_name]
START TTL MERGES
根据 TTL expression,为MergeTree系列引擎表启动后台删除旧数据。不管表存在与否,都返回 OK.。当数据库不存在时返回错误。
SYSTEM START TTL MERGES [[db.]merge_tree_family_table_name]
STOP MOVES
根据 TTL expression,为MergeTree系列引擎表停止后台移动数据。不管表存在与否,都返回 OK.。当数据库不存在时返回错误。
SYSTEM STOP MOVES [[db.]merge_tree_family_table_name]
START MOVES
根据 TTL expression,为MergeTree系列引擎表启动后台移动数据。不管表存在与否,都返回 OK.。当数据库不存在时返回错误。
SYSTEM STOP MOVES [[db.]merge_tree_family_table_name]
SYSTEM UNFREEZE
从所有磁盘中清除具有指定名称的冻结备份。 查看更多关于解冻单独部分的信息 ALTER TABLE table_name UNFREEZE WITH NAME
SYSTEM UNFREEZE WITH NAME <backup_name>
Managing ReplicatedMergeTree Tables
管理 ReplicatedMergeTree表的后台复制相关进程。
STOP FETCHES
停止后台获取 ReplicatedMergeTree系列引擎表中插入的数据块。 不管表引擎类型如何或表/数据库是否存,都返回 OK.。
SYSTEM STOP FETCHES [[db.]replicated_merge_tree_family_table_name]
START FETCHES
启动后台获取 ReplicatedMergeTree系列引擎表中插入的数据块。 不管表引擎类型如何或表/数据库是否存,都返回 OK.。
SYSTEM START FETCHES [[db.]replicated_merge_tree_family_table_name]
STOP REPLICATED SENDS
停止通过后台分发 ReplicatedMergeTree系列引擎表中新插入的数据块到集群的其它副本节点。
SYSTEM STOP REPLICATED SENDS [[db.]replicated_merge_tree_family_table_name]
START REPLICATED SENDS
启动通过后台分发 ReplicatedMergeTree系列引擎表中新插入的数据块到集群的其它副本节点。
SYSTEM START REPLICATED SENDS [[db.]replicated_merge_tree_family_table_name]
STOP REPLICATION QUEUES
停止从Zookeeper中获取 ReplicatedMergeTree系列表的复制队列的后台任务。可能的后台任务类型包含:merges, fetches, mutation,带有 ON CLUSTER的ddl语句
SYSTEM STOP REPLICATION QUEUES [[db.]replicated_merge_tree_family_table_name]
START REPLICATION QUEUES
启动从Zookeeper中获取 ReplicatedMergeTree系列表的复制队列的后台任务。可能的后台任务类型包含:merges, fetches, mutation,带有 ON CLUSTER的ddl语句
SYSTEM START REPLICATION QUEUES [[db.]replicated_merge_tree_family_table_name]
SYNC REPLICA
直到 ReplicatedMergeTree表将要和集群的其它副本进行同步之前会一直运行。如果当前对表的获取操作禁用的话,在达到 receive_timeout之前会一直运行。
SYSTEM SYNC REPLICA [db.]replicated_merge_tree_family_table_name
RESTART REPLICA
重置 ReplicatedMergeTree表的Zookeeper会话状态。该操作会以Zookeeper为参照,对比当前状态,有需要的情况下将任务添加到ZooKeeper队列。 基于ZooKeeper的日期初始化复制队列,类似于 ATTACH TABLE语句。短时间内不能对表进行任何操作。
SYSTEM RESTART REPLICA [db.]replicated_merge_tree_family_table_name
RESTART REPLICAS
重置所有 ReplicatedMergeTree表的ZooKeeper会话状态。该操作会以Zookeeper为参照,对比当前状态,有需要的情况下将任务添加到ZooKeeper队列。
SHOW
GRANT
REVOKE
ATTACH
CHECK TABLE
DESCRIBE TABLE
DETACH
DROP
EXISTS
KILL
OPTIMIZE
RENAME
SET
SET ROLE
TRUNCATE
USE
EXPLAIN