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

この記事は公開されてから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. ただし、分散キーも合わせて変更する場合は、テーブルを新規作成してデータを移すやり方の方が速い

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