Подтвердить что ты не робот

Как добавить ключ сортировки в существующую таблицу в AWS Redshift

В AWS Redshift я хочу добавить ключ сортировки к таблице, которая уже создана. Есть ли команда, которая может добавить столбец и использовать его в качестве ключа сортировки?

4b9b3361

Ответ 1

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

из http://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html:

ADD [COLUMN] column_name Добавляет столбец с указанным именем в таблицу. Вы можете добавить только один столбец в каждый оператор ALTER TABLE.

Вы не можете добавить столбец, который является ключом распространения (DISTKEY) или ключ сортировки (SORTKEY) таблицы.

Вы не можете использовать команду ALTER TABLE ADD COLUMN, чтобы изменить следующие атрибуты таблицы и столбца:

UNIQUE

ПЕРВИЧНЫЙ КЛЮЧ

ССЫЛКИ (внешний ключ)

ИДЕНТИФИКАЦИЯ

Максимальная длина имени столбца - 127 символов; более длинные имена усекаются до 127 символов. Максимальное количество столбцов, которые вы можете определить в одной таблице, составляет 1600.

Ответ 2

Как отметил Янив Кесслер, после создания таблицы невозможно добавить или изменить ключ distkey и sort, и вам нужно воссоздать таблицу и скопировать все данные в новую таблицу. Вы можете использовать следующий формат SQL для воссоздания таблицы с новым дизайном.

ALTER TABLE test_table RENAME TO old_test_table;
CREATE TABLE new_test_table([new table columns]);
INSERT INTO new_test_table (SELECT * FROM old_test_table);
ALTER TABLE new_test_table RENAME TO test_table;
DROP TABLE old_test_table;

По моему опыту, этот SQL используется не только для изменения ключей distkey и sortkey, но и для установки типа кодирования (сжатия).

Ответ 3

Чтобы добавить к ответу Янива, идеальным способом сделать это, вероятно, является использование команды CREATE TABLE AS. Вы можете указать distkey и sortkey явно. Т.е.

CREATE TABLE test_table_with_dist 
distkey(field) 
sortkey(sortfield) 
AS 
select * from test_table

Дополнительные примеры:

http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html

РЕДАКТИРОВАТЬ

Я заметил, что этот метод не сохраняет кодировку. Redshift только автоматически кодирует во время оператора копирования. Если это постоянная таблица, вам следует переопределить таблицу и указать кодировку.

create table test_table_with_dist(
    field1 varchar encode row distkey
    field2 timestam pencode delta sortkey);

insert into test_table select * from test_table;

Вы можете выяснить, какую кодировку использовать, запустив analyze compression test_table;

Ответ 4

Я следовал этому подходу для добавления столбцов сортировки к моей таблице table_transactons, более или менее такой же подход только с меньшим количеством команд.

alter table table_transactions rename to table_transactions_backup;
create table table_transactions compound sortkey(key1, key2, key3, key4) as select * from table_transactions_backup;
drop table table_transactions_backup;