[アップデート] Amazon RedshiftがMERGE、ROLLUP、CUBE、GROUPING SETS等、SQL 機能の拡張をサポートしました!(Preview) #reinvent

2022.11.29

この記事は公開されてから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)に記載があると教えてもらいました。改めて解説します。

最後に

多次元分析アプリケーションの構築や、トランザクションとUPSERTなしにシンプルにデータの更新追加が可能になるMERGEを紹介しました。ROLLUP、CUBE、GROUPING SETSなど、気になる機能もありますので、後日解説します!

参考文献