この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。DA事業本部の春田です。
Redshiftの ALTER TABLE
のオプションに、 ALTER COMPOUND SORTKEY
が追加されました!
Amazon Redshift now supports changing table sort keys dynamically
これまでソートキーを変更する際は、新規テーブルを作成して、データを移して、古いテーブルを削除するという手続きが必要でした。今回のアップデートにより、分散キーとソートキーの両方が ALTER TABLE
で変更できるようになったため、よりインタラクティブにパフォーマンスチューニングができるようになりました。
※残念ながら、 INTERLEAVED SORTKEY
はまだ対応されてません。今後のアップデートに期待ですね。
さて、気になるのは「速度的に違いはあるのか?」という点だと思います。これまでの手続きを ALTER COMPOUND SORTKEY
でラッピングしただけなのか、それとも内部処理が異なりパフォーマンスが上がっているのか、早速検証してみました。
検証
サンプルテーブルとして、ステップ 1: テストデータセットを作成する - Amazon Redshiftから customer
を使用します。クラスタはdc2.largeの2ノードを使用してます。
A
がテーブルを新規作成してデータを移す方法、 B
が ALTER 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日現在の特徴は以下の通りです。
ALTER SORTKEY
は ソートキーなし と COMPOUND SORTKEY のテーブルにしか使えない- テーブルを新規作成してデータを移す今までのやり方より、
ALTER SORTKEY
の方が速そう - ただし、分散キーも合わせて変更する場合は、テーブルを新規作成してデータを移すやり方の方が速い
ご参考になれば幸いです。