この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部のコンサルティングチームの石川です。Amazon Redshiftは、MERGE、ROLLUP、CUBE、GROUPING SETS等、SQL 機能の拡張をサポートしました!本日は、Previewでの各新機能について解説します。
SQL 機能の拡張の概要
MERGE、ROLLUP、CUBE、GROUPING SETSを新たにサポートすることによって、多次元分析アプリケーションの構築と、急速に変化するデータ追加が簡素化されます。
また、JSON および PARQUET ソース ファイルからネストされたデータを取り込むときに、より大きな半構造化データ サイズ (最大 16 MB) のサポートを拡張するようになりました。他のデータ ウェアハウス システムから Amazon Redshift に移行する場合のコード変換作業が軽減され、パフォーマンスが向上します。
これらのPreview新機能をお試しになるためには
Provisioned Clusterでお試しになるには、画面上部の[Create preview cluster]ボタンから作成画面に遷移します。
Prewiew trackは、preview_2022
を選択します。
MERGEの解説
構文
MERGE INTO target_table
USING source_table [ [ AS ] alias ] ON match_condition
WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] )
MERGEの実行例
主キー列に重複する値がある場合、MERGE は重複する値を削除できます。MERGE ステートメントの前に、target_table に 101 の ID 値を持つ 2 つの異なる行がありますが、名前の値は異なります。MERGE ステートメントの後、ID が 101 の行が 1 つだけ残ります。
dev=# CREATE TABLE target (id INT, name CHAR(10), PRIMARY KEY(id));
CREATE TABLE
dev=# CREATE TABLE source (id INT, name CHAR(10));
CREATE TABLE
dev=# INSERT INTO target VALUES (101, 'Bob'), (101, 'John'), (102, 'Susan');
INSERT 0 3
dev=# INSERT INTO source VALUES (101, 'Tony'), (103, 'Alice');
INSERT 0 2
dev=# MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
INSERT 0 2
dev=# SELECT * FROM target;
id | name
-----+------------
101 | Tony
102 | Susan
103 | Alice
(3 rows)
その他
執筆時点(2022/11/29)では、ROLLUP、CUBE、GROUPING SETSのマニュアルなどがありませんでした。Aggregation extensions (preview)に記載があると教えてもらいました。改めて解説します。
速報ありがとうございます!
CUBE, ROLLUPなどのドキュメンテーションはこちらご参照ください!https://t.co/kZpiHe2Lui— J.Ozono (@jostandard) November 29, 2022
最後に
多次元分析アプリケーションの構築や、トランザクションとUPSERTなしにシンプルにデータの更新追加が可能になるMERGEを紹介しました。ROLLUP、CUBE、GROUPING SETSなど、気になる機能もありますので、後日解説します!