web-dev-qa-db-ja.com

AWS Redshiftで既存のテーブルにソートキーを追加する方法

AWS Redshiftでは、作成済みのテーブルにソートキーを追加します。列を追加してソートキーとして使用できるコマンドはありますか?

29
jpdave

現時点では不可能だと思います(将来的には変更されることを期待しています)。過去にこの種の状況に遭遇したとき、新しいテーブルを作成し、古いテーブルからデータをコピーしました。

from http://docs.aws.Amazon.com/redshift/latest/dg/r_ALTER_TABLE.html

ADD [COLUMN] column_name指定された名前の列をテーブルに追加します。各ALTER TABLEステートメントに追加できる列は1つだけです。

テーブルの分散キー(DISTKEY)またはソートキー(SORTKEY)である列は追加できません。

ALTER TABLE ADD COLUMNコマンドを使用して、次の表および列の属性を変更することはできません。

ユニーク

主キー

REFERENCES(外部キー)

身元

列名の最大長は127文字です。長い名前は127文字に切り捨てられます。 1つのテーブルで定義できる列の最大数は1,600です。

19
Yaniv Kessler

Yanivの答えに追加するには、これを行う理想的な方法は、おそらく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

[〜#〜] edit [〜#〜]

この方法ではエンコードが保持されないことに気付きました。 Redshiftは、copyステートメント中にのみ自動的にエンコードします。これが永続的なテーブルである場合、テーブルを再定義してエンコードを指定する必要があります。

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;を実行することで、使用するエンコードを把握できます

28
paulsef11

Yaniv Kesslerが述べたように、テーブルの作成後にdistkeyとソートキーを追加または変更することはできません。また、テーブルを再作成し、すべてのデータを新しいテーブルにコピーする必要があります。次の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の変更だけでなく、encoding(compression)タイプの設定にも使用されます。

28

テーブル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;
1