AWS Redshiftでは、作成済みのテーブルにソートキーを追加します。列を追加してソートキーとして使用できるコマンドはありますか?
現時点では不可能だと思います(将来的には変更されることを期待しています)。過去にこの種の状況に遭遇したとき、新しいテーブルを作成し、古いテーブルからデータをコピーしました。
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です。
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;
を実行することで、使用するエンコードを把握できます
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)タイプの設定にも使用されます。
テーブル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;