[新機能] Amazon Redshift スキーマにストレージスペースのクォータが指定できるようになったので試してみました

2020.04.22

データアナリティクス事業本部の石川です。クラスタバージョン1.0.14677からスキーマにストレージスペースのクォータが指定できるようになりました。AWSの大薗さんがヒントをくれたので試してみました。

クォータの設定

スキーマを作成する際にストレージスペースのクォータを指定します。

CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ] 
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ] 

例えば、50GB割り当てる場合は以下のとおりです。

create schema us_sales authorization dwuser QUOTA 50 GB;

上記のスキーマの100GB割り当てに変更することも可能です。既存のテーブルに対してもクオータを設定、変更できます。

ALTER SCHEMA us_sales QUOTA 100 GB;

クオータに指定できるサイズは、2GB以上100TB以内です。

# ALTER SCHEMA qtest QUOTA 1 MB;
ERROR:  Schema quota must be between 2048 and 104857600 MB

クォータを試してみる

まずは、クォータが設定されていない普通のスキーマを作成します。

cm-redshiftdb=# CREATE SCHEMA qtest AUTHORIZATION cm_ishikawa_satoru;
CREATE SCHEMA

cm-redshiftdb=# SET search_path to 'qtest';
SET

上記のスキーマは、5GB割り当てに変更します。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB;
ALTER SCHEMA

qtestスキーマの中にlineorderテーブルを作成します。

cm-redshiftdb=# CREATE TABLE IF NOT EXISTS "qtest"."lineorder"
cm-redshiftdb-# (
cm-redshiftdb(#         "lo_orderkey" INTEGER NOT NULL  ENCODE az64
cm-redshiftdb(#         ,"lo_linenumber" INTEGER NOT NULL  ENCODE delta
cm-redshiftdb(#         ,"lo_custkey" INTEGER NOT NULL  ENCODE az64
cm-redshiftdb(#         ,"lo_partkey" INTEGER NOT NULL  ENCODE az64
cm-redshiftdb(#         ,"lo_suppkey" INTEGER NOT NULL  ENCODE az64
cm-redshiftdb(#         ,"lo_orderdate" INTEGER NOT NULL  ENCODE lzo
cm-redshiftdb(#         ,"lo_orderpriority" VARCHAR(15) NOT NULL  ENCODE bytedict
cm-redshiftdb(#         ,"lo_shippriority" VARCHAR(1) NOT NULL  ENCODE runlength
cm-redshiftdb(#         ,"lo_quantity" INTEGER NOT NULL  ENCODE delta
cm-redshiftdb(#         ,"lo_extendedprice" INTEGER NOT NULL  ENCODE lzo
cm-redshiftdb(#         ,"lo_ordertotalprice" INTEGER NOT NULL  ENCODE lzo
cm-redshiftdb(#         ,"lo_discount" INTEGER NOT NULL  ENCODE delta
cm-redshiftdb(#         ,"lo_revenue" INTEGER NOT NULL  ENCODE lzo
cm-redshiftdb(#         ,"lo_supplycost" INTEGER NOT NULL  ENCODE delta32k
cm-redshiftdb(#         ,"lo_tax" INTEGER NOT NULL  ENCODE delta
cm-redshiftdb(#         ,"lo_commitdate" INTEGER NOT NULL  ENCODE delta
cm-redshiftdb(#         ,"lo_shipmode" VARCHAR(10) NOT NULL  ENCODE bytedict
cm-redshiftdb(# )
cm-redshiftdb-# DISTSTYLE KEY
cm-redshiftdb-# DISTKEY ("lo_partkey")
cm-redshiftdb-# SORTKEY (
cm-redshiftdb(#         "lo_orderdate"
cm-redshiftdb(#         )
cm-redshiftdb-# ;
CREATE TABLE

上記のlineorderテーブルに約7.3GBのlineorder_sampleテーブルのデータをコピーします。しかし、クオータの5GBに達したため、データをコピーが中断します。

cm-redshiftdb=# SELECT size FROM svv_table_info WHERE "table" = 'lineorder_sample';
 size
------
 7351
(1 row)

cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample";
ERROR:  Transaction 46821091 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351).
Free up disk space or request increased quota for the schema(s).

クオータの10GBに変更して、データのコピーを試みると成功します。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 10 GB;
ALTER SCHEMA

cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample";
INSERT 0 182256332

すでにスキーマ内に7.3GBのデータがある状態で、クオータを5GBに設定してもエラーになりません。しかし、データを追加やテーブルを作成しようとするとエラーになります。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB;
ALTER SCHEMA

cm-redshiftdb=# CREATE TABLE testtab(id int);
ERROR:  Transaction 46821572 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351).
Free up disk space or request increased quota for the schema(s).

最後に

複数の利用者がRedshiftを利用できるように、ユーザーごとにスキーマを作成して公開するときなど、スキーマごとにディスク容量を制限したい場合があります。まさに弊社内でも同じような状況なので、クオータを設定したいと考え始めています。「地味に嬉しい機能」、同感です。

参考