パーティショニングは、テーブルが最初に定義されるときに PARTITION BY
句で指定されます。この句は、任意のカラムに対する SQL 式を含むことができ、その結果が行が送信されるパーティションを定義します。
データパーツは論理的に各パーティションに関連付けられ、隔離してクエリを実行できます。以下の例では、posts
テーブルを年でパーティショニングし、式 toYear(CreationDate)
を使用しています。行が 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.