テーブルのアトミックな置換
Doris は、二つの OLAP テーブル間でのアトミックな置換をサポートしています。一つの ALTER TABLE 文でテーブル名の入れ替え、またはテーブル全体の置換を実行できます。従来の「先に削除し、その後にロードする」方法で生じる、クエリからデータを参照できない期間を回避できます。
適用シナリオ
途中でデータが空の状態を見せずにテーブル内の全データを書き換える必要がある場合は、アトミックなテーブル置換を使用します。
| シナリオ | 推奨する方法 |
|---|---|
| テーブル全体の書き換え(オフラインでの全件再投入など) | CREATE TABLE LIKE で新しいテーブルを作成し、新しいデータをロードしてから、古いテーブルをアトミックに置換します |
| 特定のパーティションだけを置換する | 一時パーティションを参照してください |
| ロールバックのために古いテーブルを残す | swap = true を使用します。古いテーブルのデータは新しいテーブル名の下に移動します |
| 置換後に古いテーブルを残す必要がない | swap = false を使用します。古いテーブルは直接削除されます |
操作手順
「古いテーブル tbl1 を新しいデータで置き換える」場合を例に、標準的な手順を示します。
-
古いテーブルのスキーマを基に新しいテーブルを作成します。
CREATE TABLE tbl2 LIKE tbl1; -
新しいテーブル
tbl2に新しいデータをロードします。 -
アトミックな置換を実行します。
ALTER TABLE tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')]; -
swapパラメータに応じて結果を確認します(詳細は以下を参照)。
構文
ALTER TABLE [db.]tbl1 REPLACE WITH TABLE tbl2
[PROPERTIES('swap' = 'true')];
この文はテーブル tbl1 をテーブル tbl2 で置換します。swap パラメータは、置換後に古いテーブルをどのように扱うかを制御します。
swap パラメータの動作
| swap の値 | 置換後の tbl1 のデータ | 置換後の tbl2 の状態 | 主な用途 |
|---|---|---|---|
true(デフォルト) | 置換前の tbl2 のデータ | 残り、置換前の tbl1 のデータを保持します(二つのテーブルが入れ替わります) | ロールバックや比較のために古いデータを残す |
false | 置換前の tbl2 のデータ | 削除され、復元できません | 新しいデータだけが必要で、古いテーブルを破棄できる場合 |
仕組み
アトミックな置換は、複数の DDL 手順を一つのアトミックな操作にまとめます。外部からは瞬時に切り替わったように見えます。
-
swap = trueの場合:- テーブル B の名前をテーブル A に変更します。
- テーブル A の名前をテーブル B に変更します。
-
swap = falseの場合:- テーブル A を削除します。
- テーブル B の名前をテーブル A に変更します。
これらの手順はメタデータ層でアトミックなトランザクションとして実行されるため、外部からのクエリには途中の状態が見えません。
注意事項
- 置換がサポートされるのは、二つの OLAP テーブル間だけです。ほかの種類のテーブルはサポートされません。
- システムは、二つのテーブルのスキーマが同一かどうかを検証しません。スキーマの互換性は利用者が確認する必要があります。
swap = falseの場合、置換された古いテーブルは直接削除され、復元できません。このオプションは慎重に使用してください。- 権限はテーブル名に基づいてチェックされるため、置換によって権限設定は変わりません。置換後の新しいテーブルには、元のテーブル名に関連付けられた権限が自動的に適用されます。
よくある質問
Q1: 置換の実行中に、すでに実行されているクエリは影響を受けますか?
A: 置換はメタデータ層でのアトミックな操作です。すでに発行されたクエリは元のテーブルのデータを対象として完了し、新しいクエリは置換後のデータを参照します。
Q2: カラム、インデックス、パーティションが異なる二つのテーブルを置換できますか?
A: はい。システムはスキーマの整合性を検証しませんが、スキーマの互換性を保つ必要があります。互換性がないと、カラム名や型の変更によって後続のクエリやアプリケーションが失敗する可能性があります。
Q3: 置換後に元のテーブルのデータを復元できますか?
A: swap = true の場合、元のテーブルのデータは元の tbl2 という名前の下に保持され、復元できます。swap = false の場合、元のテーブルは削除されており、復元できません。
Q4: アトミックな置換をパーティションに使用できますか?
A: はい。パーティション単位でアトミックに上書きするには、一時パーティション機能を使用してください。
関連ドキュメント
- 一時パーティション:パーティション単位のアトミックな上書き
CREATE TABLE LIKE:既存テーブルのスキーマを基に新しいテーブルをすばやく作成します