【Redshift】ALTER TABLEでCompound Sort Keyが変更できるようになりました!

【Redshift】ALTER TABLEでCompound Sort Keyが変更できるようになりました!

Clock Icon2019.11.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。DA事業本部の春田です。

Redshiftの ALTER TABLE のオプションに、 ALTER COMPOUND SORTKEY が追加されました!

Amazon Redshift now supports changing table sort keys dynamically

ALTER TABLE - Amazon Redshift

これまでソートキーを変更する際は、新規テーブルを作成して、データを移して、古いテーブルを削除するという手続きが必要でした。今回のアップデートにより、分散キーとソートキーの両方が ALTER TABLE で変更できるようになったため、よりインタラクティブにパフォーマンスチューニングができるようになりました。

※残念ながら、 INTERLEAVED SORTKEY はまだ対応されてません。今後のアップデートに期待ですね。

さて、気になるのは「速度的に違いはあるのか?」という点だと思います。これまでの手続きを ALTER COMPOUND SORTKEY でラッピングしただけなのか、それとも内部処理が異なりパフォーマンスが上がっているのか、早速検証してみました。

検証

サンプルテーブルとして、ステップ 1: テストデータセットを作成する - Amazon Redshiftから customer を使用します。クラスタはdc2.largeの2ノードを使用してます。

A がテーブルを新規作成してデータを移す方法、 BALTER TABLE ALTER SORTKEY を使用する方法です。今回は以下の観点から比較しました。

  • ソートキーなしからCOMPOUND SORTKEYへ変更
  • 1カラムのCOMPOUND SORTKEYから2カラムのCOMPOUND SORTKEYへ変更
  • INTERLEAVED SORTKEYからCOMPOUND SORTKEYへ変更
  • COMPOUND SORTKEYとDISTSTYLEの同時変更

ソートキーなしからCOMPOUND SORTKEYへ変更

ソートキーが設定されていないテーブルに新たにソートキーを設定する時は、 ALTER TABLE を使ったほうがかなり速い結果となりました。

CREATE TABLE customer 
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
);
copy customer from 's3://awssampledbuswest2/ssbgz/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' 
gzip compupdate off region 'us-west-2';

-- A -> 9.3s
CREATE TABLE customer_new
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
COMPOUND SORTKEY ("c_custkey");
INSERT INTO customer_new SELECT * FROM customer;
ALTER TABLE customer RENAME TO customer_old;
ALTER TABLE customer_new RENAME TO customer;
VACUUM customer;
ANALYZE customer;

-- B -> 3.5s
ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey");
VACUUM customer;
ANALYZE customer;

1カラムのCOMPOUND SORTKEYから2カラムのCOMPOUND SORTKEYへ変更

既存のソートキーのカラムを変更する場合は、 ALTER TABLE を使ったほうがわずかに速い結果となりました。

CREATE TABLE customer 
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
COMPOUND SORTKEY ("c_custkey");
copy customer from 's3://awssampledbuswest2/ssbgz/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' 
gzip compupdate off region 'us-west-2';

-- A -> 4.0s
CREATE TABLE customer_new
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
COMPOUND SORTKEY ("c_custkey", "c_name");
INSERT INTO customer_new SELECT * FROM customer;
ALTER TABLE customer RENAME TO customer_old;
ALTER TABLE customer_new RENAME TO customer;
VACUUM customer;
ANALYZE customer;

-- B -> 3.4s
ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey", "c_name");
VACUUM customer;
ANALYZE customer;

INTERLEAVED SORTKEYからCOMPOUND SORTKEYへ変更

試しに INTERLEAVED SORTKEY から COMPOUND SORTKEY への変更を試みたのですが、 ERROR: ALTER TABLE ALTER SORTKEY cannot alter z-indexed table. とエラーが吐き出され、変更はできませんでした。

CREATE TABLE customer 
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
INTERLEAVED SORTKEY ("c_custkey", "c_name");
copy customer from 's3://awssampledbuswest2/ssbgz/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' 
gzip compupdate off region 'us-west-2';

-- A -> 4.2s
CREATE TABLE customer_new
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
COMPOUND SORTKEY ("c_custkey", "c_name");
INSERT INTO customer_new SELECT * FROM customer;
ALTER TABLE customer RENAME TO customer_old;
ALTER TABLE customer_new RENAME TO customer;
VACUUM customer;
ANALYZE customer;

-- B -> ERROR:  ALTER TABLE ALTER SORTKEY cannot alter z-indexed table.
ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey", "c_name");
VACUUM customer;
ANALYZE customer;

COMPOUND SORTKEYとDISTSTYLEの変更

分散キーとソートキーを同時に変更する時は、新しくテーブルを作成した方が良さそうですね。

CREATE TABLE customer 
(
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
DISTSTYLE KEY DISTKEY ("c_custkey")
COMPOUND SORTKEY ("c_custkey");
copy customer from 's3://awssampledbuswest2/ssbgz/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' 
gzip compupdate off region 'us-west-2';

-- A -> 15.0s
CREATE TABLE customer_new (
  c_custkey      INTEGER NOT NULL,
  c_name         VARCHAR(25) NOT NULL,
  c_address      VARCHAR(25) NOT NULL,
  c_city         VARCHAR(10) NOT NULL,
  c_nation       VARCHAR(15) NOT NULL,
  c_region       VARCHAR(12) NOT NULL,
  c_phone        VARCHAR(15) NOT NULL,
  c_mktsegment   VARCHAR(10) NOT NULL
)
DISTSTYLE KEY DISTKEY ("c_name")
SORTKEY ("c_name");
INSERT INTO customer_new SELECT * FROM customer;
ALTER TABLE customer RENAME TO customer_old;
ALTER TABLE customer_new RENAME TO customer;
VACUUM customer;
ANALYZE customer;

-- B -> 24.2s
ALTER TABLE customer_old ALTER DISTKEY "c_name";
ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_name") ;
VACUUM customer;
ANALYZE customer;

まとめ

2019年11月9日現在の特徴は以下の通りです。

  1. ALTER SORTKEYソートキーなしCOMPOUND SORTKEY のテーブルにしか使えない
  2. テーブルを新規作成してデータを移す今までのやり方より、 ALTER SORTKEY の方が速そう
  3. ただし、分散キーも合わせて変更する場合は、テーブルを新規作成してデータを移すやり方の方が速い

ご参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.