ALTER TABLE
説明
既存のテーブルを修正します。以下を含みます:
- テーブル、パーティション、インデックス、または列の名前変更
- テーブルコメントの修正
- パーティションの修正(パーティションの追加/削除とパーティション属性の修正)
- バケット法とバケット数の修正
- 列の修正(列の追加/削除と列の順序変更)
- ロールアップインデックスの作成/削除
- ビットマップインデックスの修正
- テーブルプロパティの修正
- アトミックスワップ
- 手動データバージョンのコンパクション
- 主キー永続性インデックスの削除
この操作には、対象テーブルに対する ALTER 権限が必要です。
構文
ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]
alter_clause
には以下の操作が含まれます:名前変更、コメント、パーティション、バケット、列、ロールアップインデックス、ビットマップインデックス、テーブルプロパティ、スワップ、およびコンパクション。
- 名前変更: テーブル、ロールアップインデックス、パーティション、または列の名前を変更します(v3.3.2以降でサポート)。
- コメント: テーブルコメントを修正します(v3.1以降でサポート)。
- パーティション: パーティションプロパティを修正、パーティションを削除、またはパーティションを追加します。
- バケット: バケット法とバケット数を修正します。
- 列: 列を追加、削除、または再配置、または列タイプを修正します。
- ロールアップインデックス: ロールアップインデックスを作成または削除します。
- ビットマップインデックス: インデックスを修正します(ビットマップインデックスのみ修正可能)。
- スワップ: 2つのテーブルをアトミックに交換します。
- コンパクション: ロードされたデータのバージョンをマージするための手動コンパクションを実行します(v3.1以降でサポート)。
- 永続性インデックスの削除: 共有データクラスタの主キーテーブルの永続性インデックスを削除します。v3.3.9以降でサポート。
制限と使用上の注意
- パーティション、列、およびロールアップインデックスに対する操作は、1つの ALTER TABLE ステートメントで実行できません。
- 列コメントは修正できません。
- 1つのテーブルには、同時に1つのスキーマ変更操作しか実行できません。同時に2つのスキーマ変更コマンドを実行することはできません。
- バケット、列、およびロールアップインデックスに対する操作は非同期操作です。タスクが送信された後、成功メッセージが即座に返されます。SHOW ALTER TABLE コマンドを実行して進行状況を確認し、CANCEL ALTER TABLE コマンドを実行して操作をキャンセルできます。
- 名前変更、コメント、パーティション、ビットマップインデックス、およびスワップに対する操作は同期操作であり、コマンドの返り値は実行が完了したことを示します。
名前変更
名前変更は、テーブル名、ロールアップインデックス、およびパーティション名の修正をサポートします。
テーブルの名前変更
ALTER TABLE <tbl_name> RENAME <new_tbl_name>
ロールアップインデックスの名前変更
ALTER TABLE [<db_name>.]<tbl_name>
RENAME ROLLUP <old_rollup_name> <new_rollup_name>
パーティションの名前変更
ALTER TABLE [<db_name>.]<tbl_name>
RENAME PARTITION <old_partition_name> <new_partition_name>
列の名前変更
v3.3.2以降、StarRocksは列の名前変更をサポートしています。
ALTER TABLE [<db_name>.]<tbl_name>
RENAME COLUMN <old_col_name> [ TO ] <new_col_name>
- 列をAからBに名前変更した後、新しい列名Aを持つ列を追加することはサポートされていません。
- 名前変更された列に基づいて構築されたマテリアライズドビューは効果を持ちません。新しい名前の列に基づいて再構築する必要があります。
テーブルコメントの修正 (v3.1以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";
現在、列コメントは修正できません。
パーティションの修正
パーティションの追加
範囲パーティションまたはリストパーティションを追加できます。式パーティションの追加はサポートされていません。
構文:
-
範囲パーティション
ALTER TABLE
ADD { single_range_partition | multi_range_partitions } [distribution_desc] ["key"="value"];
single_range_partition ::=
PARTITION [IF NOT EXISTS] <partition_name> VALUES partition_key_desc
partition_key_desc ::=
{ LESS THAN { MAXVALUE | value_list }
| [ value_list , value_list ) } -- [ は左閉区間を表します。
value_list ::=
( <value> [, ...] )
multi_range_partitions ::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- STARTとENDで指定されたパーティション列の値が整数であっても、パーティション列の値はダブルクォートで囲む必要があります。ただし、EVERY句の間隔値はダブルクォートで囲む必要はありません。 -
リストパーティション
ALTER TABLE
ADD PARTITION <partition_name> VALUES IN (value_list) [distribution_desc] ["key"="value"];
value_list ::=
value_item [, ...]
value_item ::=
{ <value> | ( <value> [, ...] ) }
パラメータ:
-
パーティション関連のパラメータ:
- 範囲パーティションの場合、単一の範囲パーティション(
single_range_partition
)またはバッチで複数の範囲パーティション(multi_range_partitions
)を追加できます。 - リストパーティションの場合、単一のリストパーティションのみ追加できます。
- 範囲パーティションの場合、単一の範囲パーティション(
-
distribution_desc
:新しいパーティションのバケット数を個別に設定できますが、バケット法を個別に設定することはできません。
-
"key"="value"
:新しいパーティションのプロパティを設定できます。詳細は CREATE TABLE を参照してください。
例:
-
範囲パーティション
-
テーブル作成時にパーティション列が
event_day
と指定されている場合、例えばPARTITION BY RANGE(event_day)
、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE site_access ADD PARTITION p4 VALUES LESS THAN ("2020-04-30");
-
テーブル作成時にパーティション列が
datekey
と指定されている場合、例えばPARTITION BY RANGE (datekey)
、テーブル作成後にバッチで複数のパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE site_access
ADD PARTITIONS START ("2021-01-05") END ("2021-01-10") EVERY (INTERVAL 1 DAY);
-
-
リストパーティション
-
テーブル作成時に単一のパーティション列が指定されている場合、例えば
PARTITION BY LIST (city)
、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE t_recharge_detail2
ADD PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"); -
テーブル作成時に複数のパーティション列が指定されている場合、例えば
PARTITION BY LIST (dt,city)
、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE t_recharge_detail4
ADD PARTITION p202204_California VALUES IN
(
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
);
-
パーティションの削除
構文:
-- 2.0以前
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS | FORCE] <partition_name>
-- 2.0以降
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS] <partition_name> [FORCE]
- パーティション化されたテーブルには少なくとも1つのパーティションを保持してください。
- FORCEが指定されていない場合、RECOVER コマンドを使用して指定された期間内(デフォルトで1日)に削除されたパーティションを復元できます。
- FORCEが指定されている場合、パーティションは未完了の操作があっても直接削除され、復元できません。したがって、一般的にこの操作は推奨されません。
一時パーティションの追加
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]]
一時パーティションを使用して現在のパーティションを置き換える
構文:
ALTER TABLE [<db_name>.]<tbl_name>
REPLACE PARTITION <partition_name>
partition_desc ["key"="value"]
WITH TEMPORARY PARTITION
partition_desc ["key"="value"]
[PROPERTIES ("key"="value", ...)]
一時パーティションの削除
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP TEMPORARY PARTITION <partition_name>
パーティションプロパティの修正
構文
ALTER TABLE [<db_name>.]<tbl_name>
MODIFY PARTITION { <partition_name> | ( <partition1_name> [, <partition2_name> ...] ) | (*) }
SET ("key" = "value", ...);
使用法
-
パーティションの以下のプロパティを修正できます:
- 記憶媒体
- storage_cooldown_ttl または storage_cooldown_time
- replication_num
-
テーブルに1つのパーティションしかない場合、パーティション名はテーブル名と同じです。複数のパーティションに分割されている場合、
(*)
を使用してすべてのパーティションのプロパティを修正できます。これにより、より便利です。 -
修正後のパーティションプロパティを表示するには、
SHOW PARTITIONS FROM <tbl_name>
を実行します。
バケット法とバケット数の修正 (v3.2以降)
構文:
ALTER TABLE [<db_name>.]<table_name>
[ partition_names ]
[ distribution_desc ]
partition_names ::=
(PARTITION | PARTITIONS) ( <partition_name> [, <partition_name> ...] )
distribution_desc ::=
DISTRIBUTED BY RANDOM [ BUCKETS <num> ] |
DISTRIBUTED BY HASH ( <column_name> [, <column_name> ...] ) [ BUCKETS <num> ]
例:
例えば、元のテーブルはハッシュバケット法を使用し、バケット数は StarRocks によって自動的に設定される重複キーテーブルです。
CREATE TABLE IF NOT EXISTS details (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
device_code INT COMMENT "device code",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
PARTITION BY date_trunc('day', event_time)
DISTRIBUTED BY HASH(user_id);
-- 数日分のデータを挿入
INSERT INTO details (event_time, event_type, user_id, device_code, channel) VALUES
-- 11月26日のデータ
('2023-11-26 08:00:00', 1, 101, 12345, 2),
('2023-11-26 09:15:00', 2, 102, 54321, 3),
('2023-11-26 10:30:00', 1, 103, 98765, 1),
-- 11月27日のデータ
('2023-11-27 08:30:00', 1, 104, 11111, 2),
('2023-11-27 09:45:00', 2, 105, 22222, 3),
('2023-11-27 11:00:00', 1, 106, 33333, 1),
-- 11月28日のデータ
('2023-11-28 08:00:00', 1, 107, 44444, 2),
('2023-11-28 09:15:00', 2, 108, 55555, 3),
('2023-11-28 10:30:00', 1, 109, 66666, 1);
バケット法のみの修正
注意
- 修正はテーブル内のすべてのパーティションに適用され、特定のパーティションのみに適用することはできません。
- バケット法のみを修正する必要がある場合でも、
BUCKETS <num>
を使用してコマンドでバケット数を指定する必要があります。BUCKETS <num>
が指定されていない場合、バケット数は StarRocks によって自動的に決定されます。
-
バケット法をハッシュバケット法からランダムバケット法に修正し、バケット数は StarRocks によって自動的に設定されます。
ALTER TABLE details DISTRIBUTED BY RANDOM;
-
ハッシュバケット法のキーを
user_id, event_time
に修正し、バケット数は StarRocks によって自動的に設定されます。ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time);
バケット数のみの修正
注意
バケット数のみを修正する必要がある場合でも、バケット法をコマンドで指定する必要があります。例えば、
HASH(user_id)
。
-
すべてのパーティションのバケット数を StarRocks によって自動的に設定されるものから10に修正します。
ALTER TABLE details DISTRIBUTED BY HASH(user_id) BUCKETS 10;
-
指定されたパーティションのバケット数を StarRocks によって自動的に設定されるものから15に修正します。
ALTER TABLE details PARTITIONS (p20231127, p20231128) DISTRIBUTED BY HASH(user_id) BUCKETS 15 ;
注意
パーティション名は
SHOW PARTITIONS FROM <table_name>;
を実行して確認できます。
バケット法とバケット数の両方の修正
注意
修正はテーブル内のすべてのパーティションに適用され、特定のパーティションのみに適用することはできません。
-
バケット法をハッシュバケット法からランダムバケット法に修正し、バケット数を StarRocks によって自動的に設定されるものから10に変更します。
ALTER TABLE details DISTRIBUTED BY RANDOM BUCKETS 10;
-
ハッシュバケット法のキーを修正し、バケット数を StarRocks によって自動的に設定されるものから10に変更します。ハッシュバケット法に使用されるキーは、元の
event_time, event_type
からuser_id, event_time
に修正されます。バケット数は StarRocks によって自動的に設定されるものから10に修正されます。ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time) BUCKETS 10;
列の修正(列の追加/削除、列の順序変更)
指定したインデックスの指定した位置に列を追加
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
- 集計テーブルに値の列を追加する場合、agg_type を指定する必要があります。
- 非集計テーブル(重複キーテーブルなど)にキー列を追加する場合、KEY キーワードを指定する必要があります。
- 基本インデックスに既に存在する列をロールアップインデックスに追加することはできません。(必要に応じてロールアップインデックスを再作成できます。)
指定したインデックスに複数の列を追加
構文:
-
複数の列を追加
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)] -
複数の列を追加し、AFTER を使用して追加された列の位置を指定
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name1 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name,
ADD COLUMN column_name2 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name
[, ...]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
-
集計テーブルに値の列を追加する場合、
agg_type
を指定する必要があります。 -
非集計テーブルにキー列を追加する場合、KEY キーワードを指定する必要があります。
-
基本インデックスに既に存在する列をロールアップインデックスに追加することはできません。(必要に応じて別のロールアップインデックスを作成できます。)
生成列の追加 (v3.1以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN col_name data_type [NULL] AS generation_expr [COMMENT 'string']
生成列を追加し、その式を指定できます。生成列 は、式の結果を事前に計算して保存するために使用でき、同じ複雑な式を持つクエリを大幅に高速化します。v3.1以降、StarRocksは生成列をサポートしています。
指定したインデックスから列を削除
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP COLUMN column_name
[FROM rollup_index_name];
注意:
- パーティション列を削除することはできません。
- 基本インデックスから列を削除すると、ロールアップインデックスに含まれている場合も削除されます。
指定したインデックスの列タイプと列位置の修正
構文:
ALTER TABLE [<db_name>.]<tbl_name>
MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
-
集計モデルで値の列を修正する場合、agg_type を指定する必要があります。
-
非集計モデルでキー列を修正する場合、KEY キーワードを指定する必要があります。
-
現在、列のタイプのみを修正できます。列の他のプロパティは現在のままです。(つまり、他のプロパティは元のプロパティに従ってステートメントに明示的に記述する必要があります。例8を参照してください。)
-
パーティション列は修正できません。
-
現在サポートされている変換の種類(精度の損失はユーザーが保証します)。
- TINYINT/SMALLINT/INT/BIGINT を TINYINT/SMALLINT/INT/BIGINT/DOUBLE に変換。
- TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL を VARCHAR に変換。VARCHAR は最大長の修正をサポートします。
- VARCHAR を TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE に変換。
- VARCHAR を DATE に変換(現在、6つの形式をサポート:"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d")
- DATETIME を DATE に変換(年-月-日の情報のみが保持されます。例:
2019-12-09 21:47:05
<-->
2019-12-09
) - DATE を DATETIME に変換(時、分、秒をゼロに設定します。例:
2019-12-09
<-->
2019-12-09 00:00:00
) - FLOAT を DOUBLE に変換
- INT を DATE に変換(INT データの変換に失敗した場合、元のデータはそのままです)
-
NULL から NOT NULL への変換はサポートされていません。
指定したインデックスの列を再配置
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
- インデックス内のすべての列を記述する必要があります。
- 値の列はキー列の後にリストされます。
ソートキーの修正
v3.0以降、主キーテーブルのソートキーを修正できます。v3.3では、このサポートが重複キーテーブル、集計テーブル、およびユニークキーテーブルに拡張されました。
重複キーテーブルおよび主キーテーブルのソートキーは、任意のソート列の組み合わせにすることができます。集計テーブルおよびユニークキーテーブルのソートキーには、すべてのキー列を含める必要がありますが、列の順序はキー列と同じである必要はありません。
構文:
ALTER TABLE [<db_name>.]<table_name>
[ order_desc ]
order_desc ::=
ORDER BY <column_name> [, <column_name> ...]
例: 主キーテーブルのソートキーを修正します。
例えば、元のテーブルは主キーテーブルであり、ソートキーと主キーが結合されています。それは dt, order_id
です。
create table orders (
dt date NOT NULL,
order_id bigint NOT NULL,
user_id int NOT NULL,
merchant_id int NOT NULL,
good_id int NOT NULL,
good_name string NOT NULL,
price int NOT NULL,
cnt int NOT NULL,
revenue int NOT NULL,
state tinyint NOT NULL
) PRIMARY KEY (dt, order_id)
PARTITION BY date_trunc('day', dt)
DISTRIBUTED BY HASH(order_id);
ソートキーを主キーから分離し、ソートキーを dt, revenue, state
に修正します。
ALTER TABLE orders ORDER BY (dt, revenue, state);
STRUCT列を修正してフィールドを追加または削除
v3.2.10およびv3.3.2以降、StarRocksはSTRUCT列を修正してフィールドを追加または削除することをサポートしています。これはネストされたフィールドやARRAYタイプ内のフィールドにも適用されます。
構文:
-- フィールドを追加
ALTER TABLE [<db_name>.]<tbl_name> MODIFY COLUMN <column_name>
ADD FIELD field_path field_desc
-- フィールドを削除
ALTER TABLE [<db_name>.]<tbl_name> MODIFY COLUMN <column_name>
DROP FIELD field_path
field_path ::= [ { <field_name>. | [*]. } [ ... ] ]<field_name>
-- ここで `[*]` は全体として事前定義されたシンボルであり、ARRAYタイプ内にネストされたSTRUCTタイプのフィールドを追加または削除する際にARRAYフィールド内のすべての要素を表します。
-- 詳細な情報については、`field_path` のパラメータ説明と例を参照してください。
field_desc ::= <field_type> [ AFTER <prior_field_name> | FIRST ]
パラメータ:
field_path
: 追加または削除するフィールド。これは単純なフィールド名であり、トップディメンションのフィールドを示します。例えば、new_field_name
。または、ネストされたフィールドを表すカラムアクセスパスであり、例えば、lv1_k1.lv2_k2.[*].new_field_name
。[*]
: STRUCTタイプがARRAYタイプ内にネストされている場合、[*]
はARRAYフィールド内のすべての要素を表します。これは、ARRAYフィールドの下にネストされたすべてのSTRUCT要素にフィールドを追加または削除するために使用されます。prior_field_name
: 新しく追加されるフィールドの前にあるフィールド。AFTERキーワードと組み合わせて新しいフィールドの順序を指定するために使用されます。FIRSTキーワードが使用されている場合、このパラメータを指定する必要はありません。新しいフィールドが最初のフィールドであることを示します。prior_field_name
の次元はfield_path
(具体的には、new_field_name
の前の部分、つまりlevel1_k1.level2_k2.[*]
)によって決定され、明示的に指定する必要はありません。
field_path
の例:
-
STRUCTフィールド内にネストされたSTRUCTフィールドのサブフィールドを追加または削除します。
例えば、
fx stuct<c1 int, c2 struct <v1 int, v2 int>>
というカラムがあるとします。c2
の下にv3
フィールドを追加する構文は次のとおりです:ALTER TABLE tbl MODIFY COLUMN fx ADD FIELD c2.v3 INT
操作後、カラムは
fx stuct<c1 int, c2 struct <v1 int, v2 int, v3 int>>
になります。 -
ARRAYフィールド内にネストされたSTRUCTフィールドのサブフィールドを追加または削除します。
例えば、
fx struct<c1 int, c2 array<struct <v1 int, v2 int>>>
というカラムがあるとします。フィールドc2
はARRAYタイプであり、2つのフィールドv1
とv2
を持つSTRUCTを含んでいます。ネストされたSTRUCTにv3
フィールドを追加する構文は次のとおりです:ALTER TABLE tbl MODIFY COLUMN fx ADD FIELD c2.[*].v3 INT
操作後、カラムは
fx struct<c1 int, c2 array<struct <v1 int, v2 int, v3 int>>>
になります。
詳細な使用方法については、Example - Column -14 を参照してください。
- 現在、この機能は共有なしクラスタでのみサポートされています。
- テーブルには
fast_schema_evolution
プロパティが有効である必要があります。 - STRUCT型のMAPサブフィールドのValue型を変更することは、Value型がARRAY、STRUCT、MAPのいずれであってもサポートされない。
- 新しく追加されたフィールドにはデフォルト値やNullableなどの属性を指定することはできません。デフォルトでNullableであり、デフォルト値はnullです。
- この機能を使用した後、この機能をサポートしていないバージョンにクラスタを直接ダウングレードすることはできません。
ロールアップインデックスの修正
ロールアップインデックスの作成
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)]
PROPERTIES: タイムアウト時間の設定をサポートし、デフォルトのタイムアウト時間は1日です。
例:
ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP r1(col1,col2) from r0;
バッチでロールアップインデックスを作成
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP [rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)],...];
例:
ALTER TABLE [<db_name>.]<tbl_name>
ADD ROLLUP r1(col1,col2) from r0, r2(col3,col4) from r0;
注意:
- from_index_name が指定されていない場合、デフォルトでベースインデックスから作成されます。
- ロールアップテーブルの列は、from_index に存在する列でなければなりません。
- プロパティでは、ストレージ形式を指定できます。詳細は CREATE TABLE を参照してください。
ロールアップインデックスの削除
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP rollup_name [PROPERTIES ("key"="value", ...)];
例:
ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1;
バッチでロールアップインデックスを削除
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP [rollup_name [PROPERTIES ("key"="value", ...)],...];
例:
ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1, r2;
注意: ベースインデックスを削除することはできません。
ビットマップインデックスの修正
ビットマップインデックスは以下の修正をサポートしています:
ビットマップインデックスの作成
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD INDEX index_name (column [, ...],) [USING BITMAP] [COMMENT 'balabala'];
注意:
1. 現在のバージョンではビットマップインデックスのみがサポートされています。
2. ビットマップインデックスは単一の列にのみ作成されます。
ビットマップインデックスの削除
構文:
DROP INDEX index_name;
テーブルプロパティの修正
構文:
ALTER TABLE [<db_name>.]<tbl_name>
SET ("key" = "value")
現在、StarRocksは以下のテーブルプロパティの修正をサポートしています:
replication_num
default.replication_num
storage_cooldown_ttl
storage_cooldown_time
- 動的パーティション化関連プロパティ
enable_persistent_index
bloom_filter_columns
colocate_with
bucket_size
(v3.2以降でサポート)base_compaction_forbidden_time_ranges
(v3.2.13以降でサポート)
- ほとんどの場合、一度に1つのプロパティのみを修正できます。これらのプロパティが同じプレフィックスを持つ場合にのみ、一度に複数のプロパティを修正できます。現在、
dynamic_partition.
およびbinlog.
のみがサポートされています。 - 上記の列に対する操作にマージすることによってもプロパティを修正できます。詳細は以下の例を参照してください。
スワップ
スワップは2つのテーブルをアトミックに交換することをサポートします。
構文:
ALTER TABLE [<db_name>.]<tbl_name>
SWAP WITH <tbl_name>;
手動コンパクション (v3.1以降)
StarRocksはコンパクションメカニズムを使用して、ロードされたデータの異なるバージョンをマージします。この機能は、小さなファイルを大きなファイルに結合することができ、クエリパフォーマンスを効果的に向上させます。
v3.1以前は、コンパクションは2つの方法で実行されていました:
- システムによる自動コンパクション:コンパクションはバックグラウンドでBEレベルで実行されます。ユーザーはコンパクションのためにデータベースやテーブルを指定することはできません。
- ユーザーはHTTPインターフェースを呼び出してコンパクションを実行できます。
v3.1以降、StarRocksはユーザーがSQLコマンドを実行して手動でコンパクションを実行できるSQLインターフェースを提供しています。特定のテーブルやパーティションを選択してコンパクションを実行できます。これにより、コンパクションプロセスに対する柔軟性と制御が向上します。
共有データクラスタはv3.3.0以降、この機能をサポートしています。
注意
v3.2.13以降、プロパティ
base_compaction_forbidden_time_ranges
を使用して、特定の時間範囲内でベースコンパクションを禁止することができます。
構文:
ALTER TABLE <tbl_name> [ BASE | CUMULATIVE ] COMPACT [ <partition_name> | ( <partition1_name> [, <partition2_name> ...] ) ]
つまり:
-- テーブル全体でコンパクションを実行します。
ALTER TABLE <tbl_name> COMPACT
-- 単一のパーティションでコンパクションを実行します。
ALTER TABLE <tbl_name> COMPACT <partition_name>
-- 複数のパーティションでコンパクションを実行します。
ALTER TABLE <tbl_name> COMPACT (<partition1_name>[,<partition2_name>,...])
-- 累積コンパクションを実行します。
ALTER TABLE <tbl_name> CUMULATIVE COMPACT (<partition1_name>[,<partition2_name>,...])
-- ベースコンパクションを実行します。
ALTER TABLE <tbl_name> BASE COMPACT (<partition1_name>[,<partition2_name>,...])
information_schema
データベースの be_compactions
テーブルにはコンパクション結果が記録されます。コンパクション後のデータバージョンをクエリするには、SELECT * FROM information_schema.be_compactions;
を実行できます。
主キー永続性インデックスの削除 (v3.3.9以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP PERSISTENT INDEX ON TABLETS(<tablet_id>[, <tablet_id>, ...]);
注意
StarRocksは、クラウドネイティブの主キーテーブルに対する永続性インデックスの削除を共有データクラスタでのみサポートしています。
例
テーブル
-
テーブルのデフォルトのレプリカ数を修正します。これは新しく追加されたパーティションのデフォルトのレプリカ数として使用されます。
ALTER TABLE example_db.my_table
SET ("default.replication_num" = "2"); -
単一パーティションテーブルの実際のレプリカ数を修正します。
ALTER TABLE example_db.my_table
SET ("replication_num" = "3"); -
レプリカ間のデータ書き込みとレプリケーションモードを修正します。
ALTER TABLE example_db.my_table
SET ("replicated_storage" = "false");この例では、レプリカ間のデータ書き込みとレプリケーションモードを「リーダーレスレプリケーション」に設定します。これは、データがプライマリおよびセカンダリレプリカを区別せずに同時に複数のレプリカに書き込まれることを意味します。詳細については、CREATE TABLE の
replicated_storage
パラメータを参照してください。
パーティション
-
パーティションを追加し、デフォルトのバケットモードを使用します。既存のパーティションは [MIN, 2013-01-01) です。追加されたパーティションは [2013-01-01, 2014-01-01) です。
ALTER TABLE example_db.my_table
ADD PARTITION p1 VALUES LESS THAN ("2014-01-01"); -
パーティションを追加し、新しいバケット数を使用します。
ALTER TABLE example_db.my_table
ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
DISTRIBUTED BY HASH(k1); -
パーティションを追加し、新しいレプリカ数を使用します。
ALTER TABLE example_db.my_table
ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
("replication_num"="1"); -
パーティションのレプリカ数を修正します。
ALTER TABLE example_db.my_table
MODIFY PARTITION p1 SET("replication_num"="1"); -
指定されたパーティションのレプリカ数をバッチで修正します。
ALTER TABLE example_db.my_table
MODIFY PARTITION (p1, p2, p4) SET("replication_num"="1"); -
すべてのパーティションの記憶媒体をバッチで修正します。
ALTER TABLE example_db.my_table
MODIFY PARTITION (*) SET("storage_medium"="HDD"); -
パーティションを削除します。
ALTER TABLE example_db.my_table
DROP PARTITION p1; -
上限と下限を持つパーティションを追加します。
ALTER TABLE example_db.my_table
ADD PARTITION p1 VALUES [("2014-01-01"), ("2014-02-01"));
ロールアップインデックス
-
ベースインデックス (k1,k2,k3,v1,v2) に基づいて
example_rollup_index
ロールアップインデックスを作成します。カラムベースのストレージが使用されます。ALTER TABLE example_db.my_table
ADD ROLLUP example_rollup_index(k1, k3, v1, v2)
PROPERTIES("storage_type"="column"); -
example_rollup_index(k1,k3,v1,v2)
に基づいてインデックスexample_rollup_index2
を作成します。ALTER TABLE example_db.my_table
ADD ROLLUP example_rollup_index2 (k1, v1)
FROM example_rollup_index; -
ベースインデックス (k1, k2, k3, v1) に基づいてインデックス
example_rollup_index3
を作成します。ロールアップのタイムアウト時間は1時間に設定されます。ALTER TABLE example_db.my_table
ADD ROLLUP example_rollup_index3(k1, k3, v1)
PROPERTIES("storage_type"="column", "timeout" = "3600"); -
インデックス
example_rollup_index2
を削除します。ALTER TABLE example_db.my_table
DROP ROLLUP example_rollup_index2;
列
-
example_rollup_index
のcol1
列の後にキー列new_col
(非集計列)を追加します。ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
TO example_rollup_index; -
example_rollup_index
のcol1
列の後に値の列new_col
(非集計列)を追加します。ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index; -
example_rollup_index
のcol1
列の後にキー列new_col
(集計列)を追加します。ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index; -
example_rollup_index
のcol1
列の後に値の列new_col SUM
(集計列)を追加します。ALTER TABLE example_db.my_table
ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
TO example_rollup_index; -
example_rollup_index
に複数の列を追加します(集計)。ALTER TABLE example_db.my_table
ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
TO example_rollup_index; -
example_rollup_index
に複数の列を追加し、AFTER
を使用して追加された列の位置を指定します。ALTER TABLE example_db.my_table
ADD COLUMN col1 INT DEFAULT "1" AFTER `k1`,
ADD COLUMN col2 FLOAT SUM AFTER `v2`,
TO example_rollup_index; -
example_rollup_index
から列を削除します。ALTER TABLE example_db.my_table
DROP COLUMN col2
FROM example_rollup_index; -
ベースインデックスの
col1
の列タイプを BIGINT に修正し、col2
の後に配置します。ALTER TABLE example_db.my_table
MODIFY COLUMN col1 BIGINT DEFAULT "1" AFTER col2; -
ベースインデックスの
val1
列の最大長を32から64に修正します。ALTER TABLE example_db.my_table
MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc"; -
example_rollup_index
の列を再配置します。元の列順序は k1, k2, k3, v1, v2 です。ALTER TABLE example_db.my_table
ORDER BY (k3,k1,k2,v2,v1)
FROM example_rollup_index; -
一度に2つの操作(ADD COLUMN と ORDER BY)を実行します。
ALTER TABLE example_db.my_table
ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index; -
テーブルのブルームフィルター列を修正します。
ALTER TABLE example_db.my_table
SET ("bloom_filter_columns"="k1,k2,k3");この操作は、上記の列操作にマージすることもできます(複数の句の構文がわずかに異なることに注意してください)。
ALTER TABLE example_db.my_table
DROP COLUMN col2
PROPERTIES ("bloom_filter_columns"="k1,k2,k3"); -
単一のステートメントで複数の列のデータタイプを修正します。
ALTER TABLE example_db.my_table
MODIFY COLUMN k1 VARCHAR(100) KEY NOT NULL,
MODIFY COLUMN v2 DOUBLE DEFAULT "1" AFTER v1; -
STRUCTタイプのデータにフィールドを追加および削除します。
前提条件: テーブルを作成し、1行のデータを挿入します。
CREATE TABLE struct_test(
c0 INT,
c1 STRUCT<v1 INT, v2 STRUCT<v4 INT, v5 INT>, v3 INT>,
c2 STRUCT<v1 INT, v2 ARRAY<STRUCT<v3 INT, v4 STRUCT<v5 INT, v6 INT>>>>
)
DUPLICATE KEY(c0)
DISTRIBUTED BY HASH(`c0`) BUCKETS 1
PROPERTIES (
"fast_schema_evolution" = "true"
);
INSERT INTO struct_test VALUES (
1,
ROW(1, ROW(2, 3), 4),
ROW(5, [ROW(6, ROW(7, 8)), ROW(9, ROW(10, 11))])
);mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v4":2,"v5":3},"v3":4}
c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}- STRUCTタイプの列に新しいフィールドを追加します。
ALTER TABLE struct_test MODIFY COLUMN c1 ADD FIELD v4 INT AFTER v2;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v4":2,"v5":3},"v4":null,"v3":4}
c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}- ネストされたSTRUCTタイプに新しいフィールドを追加します。
ALTER TABLE struct_test MODIFY COLUMN c1 ADD FIELD v2.v6 INT FIRST;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null,"v3":4}
c2: {"v1":5,"v2":[{"v3":6,"v4":{"v5":7,"v6":8}},{"v3":9,"v4":{"v5":10,"v6":11}}]}- 配列内のSTRUCTタイプに新しいフィールドを追加します。
ALTER TABLE struct_test MODIFY COLUMN c2 ADD FIELD v2.[*].v7 INT AFTER v3;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null,"v3":4}
c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}- STRUCTタイプの列からフィールドを削除します。
ALTER TABLE struct_test MODIFY COLUMN c1 DROP FIELD v3;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v6":null,"v4":2,"v5":3},"v4":null}
c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}- ネストされたSTRUCTタイプからフィールドを削除します。
ALTER TABLE struct_test MODIFY COLUMN c1 DROP FIELD v2.v4;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v6":null,"v5":3},"v4":null}
c2: {"v1":5,"v2":[{"v3":6,"v7":null,"v4":{"v5":7,"v6":8}},{"v3":9,"v7":null,"v4":{"v5":10,"v6":11}}]}- 配列内のSTRUCTタイプからフィールドを削除します。
ALTER TABLE struct_test MODIFY COLUMN c2 DROP FIELD v2.[*].v3;
mysql> SELECT * FROM struct_test\G
*************************** 1. row ***************************
c0: 1
c1: {"v1":1,"v2":{"v6":null,"v5":3},"v4":null}
c2: {"v1":5,"v2":[{"v7":null,"v4":{"v5":7,"v6":8}},{"v7":null,"v4":{"v5":10,"v6":11}}]}
テーブルプロパティ
-
テーブルのColocateプロパティを修正します。
ALTER TABLE example_db.my_table
SET ("colocate_with" = "t1"); -
テーブルの動的パーティションプロパティを修正します。
ALTER TABLE example_db.my_table
SET ("dynamic_partition.enable" = "false");
動的パーティションプロパティが構成されていないテーブルに動的パーティションプロパティを追加する必要がある場合、すべての動的パーティションプロパティを指定する必要があります。
ALTER TABLE example_db.my_table
SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
名前変更
-
table1
をtable2
に名前変更します。ALTER TABLE table1 RENAME table2;
-
example_table
のロールアップインデックスrollup1
をrollup2
に名前変更します。ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2;
-
example_table
のパーティションp1
をp2
に名前変更します。ALTER TABLE example_table RENAME PARTITION p1 p2;
ビットマップインデックス
-
table1
のsiteid
列にビットマップインデックスを作成します。ALTER TABLE table1
ADD INDEX index_1 (siteid) [USING BITMAP] COMMENT 'balabala'; -
table1
のsiteid
列のビットマップインデックスを削除します。ALTER TABLE table1
DROP INDEX index_1;
スワップ
table1
と table2
の間でアトミックスワップを行います。
ALTER TABLE table1 SWAP WITH table2
手動コンパクション
CREATE TABLE compaction_test(
event_day DATE,
pv BIGINT)
DUPLICATE KEY(event_day)
PARTITION BY date_trunc('month', event_day)
DISTRIBUTED BY HASH(event_day) BUCKETS 8
PROPERTIES("replication_num" = "3");
INSERT INTO compaction_test VALUES
('2023-02-14', 2),
('2033-03-01',2);
{'label':'insert_734648fa-c878-11ed-90d6-00163e0dcbfc', 'status':'VISIBLE', 'txnId':'5008'}
INSERT INTO compaction_test VALUES
('2023-02-14', 2),('2033-03-01',2);
{'label':'insert_85c95c1b-c878-11ed-90d6-00163e0dcbfc', 'status':'VISIBLE', 'txnId':'5009'}
ALTER TABLE compaction_test COMPACT;
ALTER TABLE compaction_test COMPACT p203303;
ALTER TABLE compaction_test COMPACT (p202302,p203303);
ALTER TABLE compaction_test CUMULATIVE COMPACT (p202302,p203303);
ALTER TABLE compaction_test BASE COMPACT (p202302,p203303);
主キー永続性インデックスの削除
共有データクラスタの主キーテーブル db1.test_tbl
のタブレット 100
および 101
に対する永続性インデックスを削除します。
ALTER TABLE db1.test_tbl DROP PERSISTENT INDEX ON TABLETS (100, 101);
参考資料