ClickHouse/docs/zh/sql-reference/statements/misc.md
2020-06-22 11:45:22 +03:00

12 KiB
Raw Blame History

machine_translated machine_translated_rev toc_priority toc_title
true 72537a2d52 41 其他

杂项查询

ATTACH

这个查询是完全一样的 CREATE,但是

  • 而不是这个词 CREATE 它使用这个词 ATTACH.
  • 查询不会在磁盘上创建数据,但假定数据已经在适当的位置,只是将有关表的信息添加到服务器。 执行附加查询后,服务器将知道表的存在。

如果表之前已分离 (DETACH),意味着其结构是已知的,可以使用速记而不限定该结构。

ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]

启动服务器时使用此查询。 服务器将表元数据作为文件存储 ATTACH 查询,它只是在启动时运行(除了在服务器上显式创建的系统表)。

CHECK TABLE

检查表中的数据是否已损坏。

CHECK TABLE [db.]name

CHECK TABLE 查询将实际文件大小与存储在服务器上的预期值进行比较。 如果文件大小与存储的值不匹配,则表示数据已损坏。 例如,这可能是由查询执行期间的系统崩溃引起的。

查询响应包含 result 具有单行的列。 该行的值为 布尔值 类型:

  • 0-表中的数据已损坏。
  • 1-数据保持完整性。

CHECK TABLE 查询支持下表引擎:

使用另一个表引擎对表执行会导致异常。

从发动机 *Log 家庭不提供故障自动数据恢复。 使用 CHECK TABLE 查询以及时跟踪数据丢失。

MergeTree 家庭发动机, CHECK TABLE 查询显示本地服务器上表的每个单独数据部分的检查状态。

如果数据已损坏

如果表已损坏,则可以将未损坏的数据复制到另一个表。 要做到这一点:

  1. 创建具有与损坏的表相同结构的新表。 要执行此操作,请执行查询 CREATE TABLE <new_table_name> AS <damaged_table_name>.
  2. 设置 max_threads 值为1以在单个线程中处理下一个查询。 要执行此操作,请运行查询 SET max_threads = 1.
  3. 执行查询 INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>. 此请求将未损坏的数据从损坏的表复制到另一个表。 只有损坏部分之前的数据才会被复制。
  4. 重新启动 clickhouse-client 要重置 max_threads 价值。

DESCRIBE TABLE

DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]

返回以下内容 String 类型列:

  • name — Column name.
  • type— Column type.
  • default_type — Clause that is used in 默认表达式 (DEFAULT, MATERIALIZEDALIAS). 如果未指定默认表达式则Column包含一个空字符串。
  • default_expression — Value specified in the DEFAULT 条款
  • comment_expression — Comment text.

嵌套的数据结构输出 “expanded” 格式。 每列分别显示,名称后面有一个点。

DETACH

删除有关 name 表从服务器。 服务器停止了解表的存在。

DETACH TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]

这不会删除表的数据或元数据。 在下一次服务器启动时,服务器将读取元数据并再次查找有关表的信息。 同样,一个 “detached” 表可以使用重新连接 ATTACH 查询(系统表除外,它们没有为它们存储元数据)。

没有 DETACH DATABASE 查询。

DROP

此查询有两种类型: DROP DATABASEDROP TABLE.

DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]

删除内部的所有表 db 数据库,然后删除 db 数据库本身。 如果 IF EXISTS 如果数据库不存在,则不会返回错误。

DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]

删除表。 如果 IF EXISTS 如果表不存在或数据库不存在,则不会返回错误。

DROP DICTIONARY [IF EXISTS] [db.]name

删除字典。 如果 IF EXISTS 如果表不存在或数据库不存在,则不会返回错误。

DROP USER

删除用户。

语法

DROP USER [IF EXISTS] name [,...] [ON CLUSTER cluster_name]

DROP ROLE

删除角色。

已删除的角色将从授予该角色的所有实体撤销。

语法

DROP ROLE [IF EXISTS] name [,...] [ON CLUSTER cluster_name]

DROP ROW POLICY

删除行策略。

已删除行策略将从分配该策略的所有实体撤销。

语法

DROP [ROW] POLICY [IF EXISTS] name [,...] ON [database.]table [,...] [ON CLUSTER cluster_name]

DROP QUOTA

删除配额。

已删除的配额将从分配配额的所有实体撤销。

语法

DROP QUOTA [IF EXISTS] name [,...] [ON CLUSTER cluster_name]

DROP SETTINGS PROFILE

删除配额。

已删除的配额将从分配配额的所有实体撤销。

语法

DROP [SETTINGS] PROFILE [IF EXISTS] name [,...] [ON CLUSTER cluster_name]

EXISTS

EXISTS [TEMPORARY] [TABLE|DICTIONARY] [db.]name [INTO OUTFILE filename] [FORMAT format]

返回单 UInt8-type column其中包含单个值 0 如果表或数据库不存在,或 1 如果该表存在于指定的数据库中。

KILL QUERY

KILL QUERY [ON CLUSTER cluster]
  WHERE <where expression to SELECT FROM system.processes query>
  [SYNC|ASYNC|TEST]
  [FORMAT format]

尝试强制终止当前正在运行的查询。 要终止的查询是从系统中选择的。使用在定义的标准进程表 WHERE 《公约》条款 KILL 查询。

例:

-- Forcibly terminates all queries with the specified query_id:
KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90'

-- Synchronously terminates all queries run by 'username':
KILL QUERY WHERE user='username' SYNC

只读用户只能停止自己的查询。

默认情况下,使用异步版本的查询 (ASYNC),不等待确认查询已停止。

同步版本 (SYNC)等待所有查询停止,并在停止时显示有关每个进程的信息。 响应包含 kill_status 列,它可以采用以下值:

  1. finished The query was terminated successfully.
  2. waiting Waiting for the query to end after sending it a signal to terminate.
  3. The other values explain why the query can't be stopped.

测试查询 (TEST)仅检查用户的权限并显示要停止的查询列表。

KILL MUTATION

KILL MUTATION [ON CLUSTER cluster]
  WHERE <where expression to SELECT FROM system.mutations query>
  [TEST]
  [FORMAT format]

尝试取消和删除 突变 当前正在执行。 要取消的突变选自 system.mutations 表使用由指定的过滤器 WHERE 《公约》条款 KILL 查询。

测试查询 (TEST)仅检查用户的权限并显示要停止的查询列表。

例:

-- Cancel and remove all mutations of the single table:
KILL MUTATION WHERE database = 'default' AND table = 'table'

-- Cancel the specific mutation:
KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt'

The query is useful when a mutation is stuck and cannot finish (e.g. if some function in the mutation query throws an exception when applied to the data contained in the table).

已经由突变所做的更改不会回滚。

OPTIMIZE

OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE]

此查询尝试使用来自表引擎的表初始化表的数据部分的非计划合并 MergeTree 家人

OPTMIZE 查询也支持 MaterializedView缓冲区 引擎 不支持其他表引擎。

OPTIMIZE 与使用 ReplicatedMergeTree 表引擎的家族ClickHouse创建合并任务并等待在所有节点上执行如果 replication_alter_partitions_sync 设置已启用)。

  • 如果 OPTIMIZE 出于任何原因不执行合并,它不通知客户端。 要启用通知,请使用 optimize_throw_if_noop 设置。
  • 如果您指定 PARTITION,仅优化指定的分区。 如何设置分区表达式.
  • 如果您指定 FINAL,即使所有数据已经在一个部分中,也会执行优化。
  • 如果您指定 DEDUPLICATE然后完全相同的行将被重复数据删除所有列进行比较这仅适用于MergeTree引擎。

!!! warning "警告" OPTIMIZE 无法修复 “Too many parts” 错误

RENAME

重命名一个或多个表。

RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster]

所有表都在全局锁定下重命名。 重命名表是一个轻型操作。 如果您在TO之后指定了另一个数据库则表将被移动到此数据库。 但是,包含数据库的目录必须位于同一文件系统中(否则,将返回错误)。

SET

SET param = value

分配 valueparam 设置 对于当前会话。 你不能改变 服务器设置 这边

您还可以在单个查询中设置指定设置配置文件中的所有值。

SET profile = 'profile-name-from-the-settings-file'

有关详细信息,请参阅 设置.

SET ROLE

激活当前用户的角色。

语法

SET ROLE {DEFAULT | NONE | role [,...] | ALL | ALL EXCEPT role [,...]}

SET DEFAULT ROLE

将默认角色设置为用户。

默认角色在用户登录时自动激活。 您只能将以前授予的角色设置为默认值。 如果未向用户授予角色ClickHouse将引发异常。

语法

SET DEFAULT ROLE {NONE | role [,...] | ALL | ALL EXCEPT role [,...]} TO {user|CURRENT_USER} [,...]

为用户设置多个默认角色:

SET DEFAULT ROLE role1, role2, ... TO user

将所有授予的角色设置为用户的默认值:

SET DEFAULT ROLE ALL TO user

从用户清除默认角色:

SET DEFAULT ROLE NONE TO user

将所有授予的角色设置为默认角色,其中一些角色除外:

SET DEFAULT ROLE ALL EXCEPT role1, role2 TO user

TRUNCATE

TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]

从表中删除所有数据。 当条款 IF EXISTS 如果该表不存在,则查询返回错误。

TRUNCATE 查询不支持 查看, 文件, URLNull 表引擎.

USE

USE db

用于设置会话的当前数据库。 当前数据库用于搜索表,如果数据库没有在查询中明确定义与表名之前的点。 使用HTTP协议时无法进行此查询因为没有会话的概念。

原始文章