删除分区 | ClickHouse 文档 - ClickHouse 教程
分区是在表最初定义时通过 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.


© . This site is unofficial and not affiliated with ClickHouse, Inc.