Перейти к основному содержимому

ALTER TABLE

ALTER TABLE изменяет существующую таблицу, включая:

подсказка

Эта операция требует привилегию ALTER на целевой таблице.

Синтаксис

ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]

alter_clause может содержать следующие операции: rename, comment, partition, bucket, column, rollup index, bitmap index, table property, swap и compaction.

  • rename: переименовывает таблицу, rollup индекс, раздел или столбец (поддерживается начиная с v3.3.2).
  • comment: изменяет комментарий таблицы (поддерживается начиная с v3.1).
  • partition: изменяет свойства раздела, удаляет раздел или добавляет раздел.
  • bucket: изменяет метод разбиения на корзины и количество корзин.
  • column: добавляет, удаляет или переупорядочивает столбцы, изменяет тип столбца или комментарий
  • rollup index: создает или удаляет rollup индекс.
  • bitmap index: изменяет индекс (можно изменять только Bitmap индекс).
  • swap: атомарный обмен двух таблиц.
  • compaction: выполняет ручное сжатие для объединения версий загруженных данных (поддерживается начиная с v3.1).
  • drop persistent index: Удаляет persistent index для Primary Key таблицы в shared-data кластере. Поддерживается начиная с v3.3.9.

Ограничения и примечания по использованию

  • Операции с partition, column и rollup index нельзя выполнять в одном операторе ALTER TABLE.
  • Одна таблица может иметь только одну выполняющуюся операцию schema change одновременно. Нельзя запускать две команды schema change на таблице одновременно.
  • Операции с bucket, column и rollup index являются асинхронными операциями. Сообщение об успехе возвращается сразу после отправки задачи. Вы можете выполнить команду SHOW ALTER TABLE для проверки прогресса и команду CANCEL ALTER TABLE для отмены операции.
  • Операции с rename, comment, partition, bitmap index и swap являются синхронными операциями, и возврат команды указывает на завершение выполнения.

Rename

Rename поддерживает изменение имени таблицы, rollup индекса и имени раздела.

Переименование таблицы

ALTER TABLE <tbl_name> RENAME <new_tbl_name>

Переименование rollup индекса

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, Selena поддерживает переименование столбцов.

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>";

Изменение раздела

ADD PARTITION(S)

Вы можете выбрать добавление range разделов или list разделов. Добавление expression разделов не поддерживается.

Синтаксис:

  • Range разделы

    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 не нужно заключать в двойные кавычки.
  • List разделы

    ALTER TABLE
    ADD PARTITION <partition_name> VALUES IN (value_list) [distribution_desc] ["key"="value"];

    value_list ::=
    value_item [, ...]

    value_item ::=
    { <value> | ( <value> [, ...] ) }

Параметры:

  • Параметры, связанные с разделами:

    • Для range разделов вы можете добавить один range раздел (single_range_partition) или несколько range разделов пакетно (multi_range_partitions).
    • Для list разделов вы можете добавить только один list раздел.
  • distribution_desc:

    Вы можете установить количество корзин для нового раздела отдельно, но не можете установить метод разбиения на корзины отдельно.

  • "key"="value":

    Вы можете установить свойства для нового раздела. Подробности см. в CREATE TABLE.

Примеры:

  • Range разделы

    • Если столбец раздела указан как 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);
  • List разделы

    • Если указан один столбец раздела при создании таблицы, например 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")
      );

DROP PARTITION

Синтаксис:

-- До 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]
примечание
  • Сохраняйте хотя бы один раздел для разделенных таблиц.
  • Если 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_medium
    • storage_cooldown_ttl или storage_cooldown_time
    • replication_num
  • Для таблицы с только одним разделом имя раздела совпадает с именем таблицы. Если таблица разделена на несколько разделов, вы можете использовать (*) для изменения свойств всех разделов, что более удобно.

  • Выполните 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> ]

Пример:

Например, исходная таблица является Duplicate Key таблицей, где используется hash разбиение на корзины, а количество корзин автоматически устанавливается Selena.

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
-- Данные 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),
-- Данные 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),
-- Данные 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> не указан, это означает, что количество корзин автоматически определяется Selena.
  • Метод разбиения на корзины изменяется на случайное разбиение с hash разбиения, а количество корзин остается автоматически устанавливаемым Selena.

    ALTER TABLE details DISTRIBUTED BY RANDOM;
  • Ключи для hash разбиения на корзины изменяются на user_id, event_time с event_time, event_type. И количество корзин остается автоматически устанавливаемым Selena.

    ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time);

Изменение только количества корзин

ВНИМАНИЕ

Хотя нужно изменить только количество корзин, метод разбиения на корзины все равно нужно указать в команде, например, HASH(user_id).

  • Изменить количество корзин для всех разделов на 10 с автоматически устанавливаемого Selena.

    ALTER TABLE details DISTRIBUTED BY HASH(user_id) BUCKETS 10;
  • Изменить количество корзин для указанных разделов на 15 с автоматически устанавливаемого Selena.

    ALTER TABLE details PARTITIONS (p20231127, p20231128) DISTRIBUTED BY HASH(user_id) BUCKETS 15 ;

    ПРИМЕЧАНИЕ

    Имена разделов можно просмотреть, выполнив SHOW PARTITIONS FROM <table_name>;.

Изменение как метода разбиения на корзины, так и количества корзин

ВНИМАНИЕ

Изменение применяется ко всем разделам в таблице и не может быть применено только к определенным разделам.

  • Изменить метод разбиения на корзины с hash разбиения на случайное разбиение и изменить количество корзин на 10 с автоматически устанавливаемого Selena.

    ALTER TABLE details DISTRIBUTED BY RANDOM BUCKETS 10;
  • Изменить ключ для hash разбиения на корзины и изменить количество корзин на 10 с автоматически устанавливаемого Selena. Ключ, используемый для hash разбиения на корзины, изменяется на user_id, event_time с исходного event_time, event_type. Количество корзин изменяется на 10 с автоматически устанавливаемого Selena.

    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", ...)]

Примечание:

  1. Если вы добавляете столбец значений в Aggregate таблицу, вам нужно указать agg_type.
  2. Если вы добавляете ключевой столбец в не-Aggregate таблицу (например, Duplicate Key таблицу), вам нужно указать ключевое слово KEY.
  3. Вы не можете добавить столбец, который уже существует в базовом индексе, в rollup индекс. (При необходимости вы можете пересоздать rollup индекс.)

Добавление нескольких столбцов в указанный индекс

Синтаксис:

  • Добавление нескольких столбцов

    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", ...)]

Примечание:

  1. Если вы добавляете столбец значений в Aggregate таблицу, вам нужно указать agg_type.

  2. Если вы добавляете ключевой столбец в не-Aggregate таблицу, вам нужно указать ключевое слово KEY.

  3. Вы не можете добавить столбец, который уже существует в базовом индексе, в rollup индекс. (При необходимости вы можете создать другой rollup индекс.)

Добавление вычисляемого столбца (начиная с v3.1)

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN col_name data_type [NULL] AS generation_expr [COMMENT 'string']

Вы можете добавить вычисляемый столбец и указать его выражение. Вычисляемый столбец может использоваться для предварительного вычисления и хранения результатов выражений, что значительно ускоряет запросы с теми же сложными выражениями. Начиная с v3.1, Selena поддерживает вычисляемые столбцы.

Удаление столбца из указанного индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP COLUMN column_name
[FROM rollup_index_name];

Примечание:

  1. Вы не можете удалить столбец раздела.
  2. Если столбец удаляется из базового индекса, он также будет удален, если он включен в rollup индекс.

Изменение типа столбца, позиции, комментария и других свойств

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
MODIFY COLUMN <column_name>
[ column_type [ KEY | agg_type ] ] [ NULL | NOT NULL ]
[ DEFAULT "<default_value>"] [ COMMENT "<new_column_comment>" ]
[ AFTER <column_name> | FIRST ]
[ FROM rollup_index_name ]
[ PROPERTIES ("key"="value", ...) ]

Примечание:

  1. Если вы изменяете столбец значений в агрегационных моделях, вам нужно указать agg_type.

  2. Если вы изменяете ключевой столбец в не-агрегационных моделях, вам нужно указать ключевое слово KEY.

  3. Можно изменить только тип столбца. Другие свойства столбца остаются такими, какими они являются в настоящее время. (т.е. другие свойства должны быть явно записаны в операторе в соответствии с исходным свойством, см. пример 8 в части column).

  4. Столбец раздела нельзя изменить.

  5. В настоящее время поддерживаются следующие типы преобразований (потеря точности гарантируется пользователем).

    • Преобразование 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 (в настоящее время поддерживает шесть форматов: "%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 не удается преобразовать, исходные данные остаются прежними)
  6. Преобразование из NULL в NOT NULL не поддерживается.

  7. Вы можете изменить несколько свойств в одном предложении MODIFY COLUMN. Однако некоторые комбинации свойств не поддерживаются.

Переупорядочивание столбцов указанного индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]

Примечание:

  • Все столбцы в индексе должны быть записаны.
  • Столбец значений указывается после ключевого столбца.

Изменение ключа сортировки

Начиная с v3.0, ключи сортировки для Primary Key таблиц можно изменять. v3.3 расширяет эту поддержку на Duplicate Key таблицы, Aggregate таблицы и Unique Key таблицы.

Ключи сортировки в Duplicate Key таблицах и Primary Key таблицах могут быть комбинацией любых столбцов сортировки. Ключи сортировки в Aggregate таблицах и Unique Key таблицах должны включать все ключевые столбцы, но порядок столбцов не обязательно должен совпадать с ключевыми столбцами.

Синтаксис:

ALTER TABLE [<db_name>.]<table_name>
[ order_desc ]

order_desc ::=
ORDER BY <column_name> [, <column_name> ...]

Пример: изменение ключей сортировки в Primary Key таблицах.

Например, исходная таблица является Primary Key таблицей, где ключ сортировки и первичный ключ связаны, что является 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, Selena поддерживает изменение столбца 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, или Column Access Path, который представляет вложенное поле, например, lv1_k1.lv2_k2.[*].new_field_name.
  • [*]: Когда тип STRUCT вложен в тип ARRAY, [*] представляет все элементы в поле ARRAY. Он используется для добавления или удаления поля во всех элементах STRUCT, вложенных под полем ARRAY.
  • 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>>. Синтаксис для добавления поля v3 под c2:

    ALTER TABLE tbl MODIFY COLUMN fx ADD FIELD c2.v3 INT

    После операции столбец становится fx stuct<c1 int, c2 struct <v1 int, v2 int, v3 int>>.

  • Добавить или удалить подполе в каждом поле STRUCT, вложенном в поле ARRAY.

    Предположим, есть столбец fx struct<c1 int, c2 array<struct <v1 int, v2 int>>>. Поле c2 является типом ARRAY, который содержит STRUCT с двумя полями v1 и v2. Синтаксис для добавления поля v3 в вложенный STRUCT:

    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.

примечание
  • В настоящее время эта функция поддерживается только в shared-nothing кластерах.
  • Таблица должна иметь включенное свойство fast_schema_evolution.
  • Изменение типа Value подполя MAP в типе STRUCT не поддерживается, независимо от того, является ли тип Value ARRAY, STRUCT или MAP.
  • Вновь добавленные поля не могут иметь значения по умолчанию или атрибуты, такие как Nullable. По умолчанию они являются Nullable со значением по умолчанию null.
  • После использования этой функции прямое понижение версии кластера до версии, которая не поддерживает эту функцию, не разрешается.

Изменение rollup индекса

Создание rollup индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name> 
ADD ROLLUP rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)]

PROPERTIES: Поддерживает установку времени ожидания, время ожидания по умолчанию составляет один день.

Пример:

ALTER TABLE [<db_name>.]<tbl_name> 
ADD ROLLUP r1(col1,col2) from r0;

Создание rollup индексов пакетно

Синтаксис:

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;

Примечание:

  1. Если from_index_name не указан, то создается из базового индекса по умолчанию.
  2. Столбцы в rollup таблице должны быть существующими столбцами в from_index.
  3. В свойствах пользователь может указать формат хранения. См. CREATE TABLE для подробностей.

Удаление rollup индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP rollup_name [PROPERTIES ("key"="value", ...)];

Пример:

ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1;

Пакетное удаление rollup индексов

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP ROLLUP [rollup_name [PROPERTIES ("key"="value", ...)],...];

Пример:

ALTER TABLE [<db_name>.]<tbl_name> DROP ROLLUP r1, r2;

Примечание: Вы не можете удалить базовый индекс.

Изменение bitmap индексов

Bitmap индекс поддерживает следующие изменения:

Создание bitmap индекса

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
ADD INDEX index_name (column [, ...],) [USING BITMAP] [COMMENT 'balabala'];

Примечание:

1. Bitmap индекс поддерживается только для текущей версии.
2. BITMAP индекс создается только в одном столбце.

Удаление bitmap индекса

Синтаксис:

DROP INDEX index_name;

Изменение свойств таблицы

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
SET ("key" = "value")

В настоящее время Selena поддерживает изменение следующих свойств таблицы:

  • replication_num
  • default.replication_num
  • default.storage_medium
  • Свойства, связанные с динамическим разделением
  • enable_persistent_index
  • bloom_filter_columns
  • colocate_with
  • bucket_size (поддерживается с 3.2)
  • base_compaction_forbidden_time_ranges (поддерживается с v3.2.13)
примечание
  • В большинстве случаев вам разрешено изменять только одно свойство за раз. Вы можете изменять несколько свойств одновременно только если эти свойства имеют одинаковый префикс. В настоящее время поддерживаются только dynamic_partition. и binlog..
  • Вы также можете изменить свойства, объединив их с вышеуказанной операцией со столбцом. См. следующие примеры.

Swap

Swap поддерживает атомарный обмен двух таблиц.

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
SWAP WITH <tbl_name>;

Ручное сжатие (начиная с 3.1)

Selena использует механизм сжатия для объединения различных версий загруженных данных. Эта функция может объединять небольшие файлы в большие файлы, что эффективно улучшает производительность запросов.

До v3.1 сжатие выполнялось двумя способами:

  • Автоматическое сжатие системой: Compaction выполняется на уровне BE в фоновом режиме. Пользователи не могут указать базу данных или таблицу для сжатия.
  • Пользователи могут выполнять сжатие, вызывая HTTP-интерфейс.

Начиная с v3.1, Selena предлагает SQL-интерфейс для пользователей для ручного выполнения сжатия путем выполнения SQL-команд. Они могут выбрать конкретную таблицу или раздел для сжатия. Это обеспечивает большую гибкость и контроль над процессом сжатия.

Shared-data кластеры поддерживают эту функцию начиная с v3.3.0.

ПРИМЕЧАНИЕ

Начиная с v3.2.13, вы можете запретить Base Compaction в определенном временном диапазоне, используя свойство 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>,...])

-- Выполнить cumulative сжатие.
ALTER TABLE <tbl_name> CUMULATIVE COMPACT (<partition1_name>[,<partition2_name>,...])

-- Выполнить base сжатие.
ALTER TABLE <tbl_name> BASE COMPACT (<partition1_name>[,<partition2_name>,...])

Таблица be_compactions в базе данных information_schema записывает результаты сжатия. Вы можете выполнить SELECT * FROM information_schema.be_compactions; для запроса версий данных после сжатия.

Удаление Primary Key Persistent Index (начиная с 3.3.9)

Синтаксис:

ALTER TABLE [<db_name>.]<tbl_name>
DROP PERSISTENT INDEX ON TABLETS(<tablet_id>[, <tablet_id>, ...]);

ПРИМЕЧАНИЕ

Selena поддерживает только удаление persistent индексов для облачных Primary Key таблиц в shared-data кластерах.

Примеры

Таблица

  1. Изменить количество реплик таблицы по умолчанию, которое используется как количество реплик по умолчанию для вновь добавленных разделов.

    ALTER TABLE example_db.my_table
    SET ("default.replication_num" = "2");
  2. Изменить фактическое количество реплик таблицы с одним разделом.

    ALTER TABLE example_db.my_table
    SET ("replication_num" = "3");
  3. Изменить режим записи данных и репликации между репликами.

    ALTER TABLE example_db.my_table
    SET ("replicated_storage" = "false");

    Этот пример устанавливает режим записи данных и репликации между репликами на "leaderless replication", что означает, что данные записываются в несколько реплик одновременно без различения первичных и вторичных реплик. Для получения дополнительной информации см. параметр replicated_storage в CREATE TABLE.

Раздел

  1. Добавить раздел и использовать режим разбиения на корзины по умолчанию. Существующий раздел [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");
  2. Добавить раздел и использовать новое количество корзин.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    DISTRIBUTED BY HASH(k1);
  3. Добавить раздел и использовать новое количество реплик.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    ("replication_num"="1");
  4. Изменить количество реплик для раздела.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION p1 SET("replication_num"="1");
  5. Пакетно изменить количество реплик для указанных разделов.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (p1, p2, p4) SET("replication_num"="1");
  6. Пакетно изменить носитель хранения всех разделов.

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (*) SET("storage_medium"="HDD");
  7. Удалить раздел.

    ALTER TABLE example_db.my_table
    DROP PARTITION p1;
  8. Добавить раздел с верхними и нижними границами.

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES [("2014-01-01"), ("2014-02-01"));

Rollup индекс

  1. Создать rollup индекс example_rollup_index на основе базового индекса (k1,k2,k3,v1,v2). Используется столбцовое хранение.

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index(k1, k3, v1, v2)
    PROPERTIES("storage_type"="column");
  2. Создать индекс example_rollup_index2 на основе example_rollup_index(k1,k3,v1,v2).

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index2 (k1, v1)
    FROM example_rollup_index;
  3. Создать индекс example_rollup_index3 на основе базового индекса (k1, k2, k3, v1). Время ожидания rollup установлено на один час.

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index3(k1, k3, v1)
    PROPERTIES("storage_type"="column", "timeout" = "3600");
  4. Удалить индекс example_rollup_index2.

    ALTER TABLE example_db.my_table
    DROP ROLLUP example_rollup_index2;

Столбец

  1. Добавить ключевой столбец new_col (не агрегационный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
    TO example_rollup_index;
  2. Добавить столбец значений new_col (не агрегационный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  3. Добавить ключевой столбец new_col (агрегационный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  4. Добавить столбец значений new_col SUM (агрегационный столбец) после столбца col1 в example_rollup_index.

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
    TO example_rollup_index;
  5. Добавить несколько столбцов в 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;
  6. Добавить несколько столбцов в 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;
  7. Удалить столбец из example_rollup_index.

    ALTER TABLE example_db.my_table
    DROP COLUMN col2
    FROM example_rollup_index;
  8. Изменить тип столбца col1 базового индекса на BIGINT и поместить его после col2.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN col1 BIGINT DEFAULT "1" AFTER col2;
  9. Изменить максимальную длину столбца val1 базового индекса на 64. Исходная длина 32.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
  10. Переупорядочить столбцы в 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;
  11. Выполнить две операции (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;
  12. Изменить bloomfilter столбцы таблицы.

    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");
  13. Изменить тип данных нескольких столбцов в одном операторе.

    ALTER TABLE example_db.my_table
    MODIFY COLUMN k1 VARCHAR(100) KEY NOT NULL,
    MODIFY COLUMN v2 DOUBLE DEFAULT "1" AFTER v1;
  14. Добавить и удалить поля в данных типа STRUCT.

    Предварительные условия: Создать таблицу и вставить строку данных.

    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}}]}

Свойство таблицы

  1. Изменить свойство Colocate таблицы.

    ALTER TABLE example_db.my_table
    SET ("colocate_with" = "t1");
  2. Изменить свойство динамического раздела таблицы.

    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"
    );
  3. Изменить свойство носителя хранения таблицы.

    ALTER TABLE example_db.my_table SET("default.storage_medium"="SSD");

Переименование

  1. Переименовать table1 в table2.

    ALTER TABLE table1 RENAME table2;
  2. Переименовать rollup индекс rollup1 в example_table в rollup2.

    ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2;
  3. Переименовать раздел p1 в example_table в p2.

    ALTER TABLE example_table RENAME PARTITION p1 p2;

Bitmap индекс

  1. Создать bitmap индекс для столбца siteid в table1.

    ALTER TABLE table1
    ADD INDEX index_1 (siteid) [USING BITMAP] COMMENT 'balabala';
  2. Удалить bitmap индекс столбца siteid в table1.

    ALTER TABLE table1
    DROP INDEX index_1;

Swap

Атомарный обмен между 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);

Удаление Primary Key Persistent Index

Удалить persistent индекс на планшетах 100 и 101 для Primary Key таблицы db1.test_tbl в shared-data кластере.

ALTER TABLE db1.test_tbl DROP PERSISTENT INDEX ON TABLETS (100, 101);

Ссылки