跳到主要内容
跳到主要内容

删除分区

背景

分区在表最初通过 PARTITION BY 子句定义时指定。此子句可以包含任何列上的 SQL 表达式,其结果将定义行发送到哪个分区。

数据部件在逻辑上与磁盘上的每个分区相关联,并且可以隔离查询。对于下面的示例,我们使用表达式 toYear(CreationDate) 按年份对 posts 表进行分区。当行插入到 ClickHouse 中时,将针对每一行评估此表达式,如果分区存在,则将行路由到结果分区(如果该行是某一年的第一行,则将创建分区)。

 CREATE TABLE posts
(
`Id` Int32 CODEC(Delta(4), ZSTD(1)),
`PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8),
`AcceptedAnswerId` UInt32,
`CreationDate` DateTime64(3, 'UTC'),
...
`ClosedDate` DateTime64(3, 'UTC')
)
ENGINE = MergeTree
ORDER BY (PostTypeId, toDate(CreationDate), CreationDate)
PARTITION BY toYear(CreationDate)

阅读有关在 如何设置分区表达式 部分中设置分区表达式的内容。

在 ClickHouse 中,用户主要应将分区视为数据管理功能,而不是查询优化技术。通过基于键逻辑地分离数据,可以独立地操作每个分区,例如删除。这允许用户在 存储层 之间有效地按时间移动分区以及子集,或者 使数据过期/有效地从集群中删除数据

删除分区

ALTER TABLE ... DROP PARTITION 提供了一种经济高效的方式来删除整个分区。

ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr

此查询将分区标记为非活动状态,并在大约 10 分钟内完全删除数据。该查询被复制 - 它在所有副本上删除数据。

在下面的示例中,我们通过删除关联的分区来删除早期表中 2008 年的帖子。

SELECT DISTINCT partition
FROM system.parts
WHERE `table` = 'posts'

┌─partition─┐
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
└───────────┘

17 rows in set. Elapsed: 0.002 sec.

ALTER TABLE posts
(DROP PARTITION '2008')

0 rows in set. Elapsed: 0.103 sec.