最近、Redshiftを検討するため調べたメモです.
RedshiftはInsertやUpdate、さらにはカラム型なので1行単位のSelectが遅いらしいです. PostgreSQLと互換があると言っても同じように使えません.
同じ感じに使うと遅くて辛い目にあいます.
DBとして役たたない感じに聞こえますが集計等が得意なので、
それ以外は割り切った使い方をした方が良い感じです.
この記事で書かれている内容は以下のスライドで アトミック洗い替え を検証したものになります.
データ作成と集計を分離する
検証するためにテーブルsample1
を作成します.
このテーブルは集計用で更新系のクエリは発行しません.
BEGIN;
CREATE TABLE sample1 (c1 BIGINT NOT NULL);
INSERT INTO sample1 VALUES (1), (2);
SELECT * FROM sample1;
COMMIT;
次にテーブルsample1_new
を作成します.
このテーブルは更新系で具体的にはInsert若しくはCopyでS3等からデータを投入するようにします.
BEGIN;
CREATE TABLE sample1_new (c1 BIGINT NOT NULL);
INSERT INTO sample1_new VALUES (11), (12);
SELECT * FROM sample1_new;
COMMIT;
次にsample1
とsample1_new
を入れ替えてロールバックしてみます.
トランザクション内ではsample1
の内容が変わっていることが確認できました.
BEGIN;
ALTER TABLE sample1 RENAME TO sample1_old;
ALTER TABLE sample1_new RENAME TO sample1;
SELECT * FROM sample1; -- 11, 12
ROLLBACK;
ではロールバックは正しくできているか確認してみます.
BEGIN;
SELECT * FROM sample1; -- 1, 2
COMMIT;
今度は入れ替えをコミットします.
BEGIN;
ALTER TABLE sample1 RENAME TO sample1_old;
ALTER TABLE sample1_new RENAME TO sample1;
COMMIT;
Selectした結果が入れ替わっているか確認してみます.
BEGIN;
SELECT * FROM sample1; -- 11, 12
COMMIT;
この様な感じでアトミックにデータ更新ができました.
長所と短所を把握して設計してあげれば実用に使えます.
ちなみに、トランザクション中、他のトランザクションの開始を確認したところ、先に開始したトランザクションが終了するまで待たされます.