CTAS の使用に関する注意事項 - Amazon Redshift

CTAS の使用に関する注意事項

制限

Amazon Redshift は、ノードタイプごとにクラスターあたりのテーブル数のクォータを適用します。

テーブルの最大文字数は 127 です。

1 つのテーブルで定義できる列の最大数は 1,600 です。

列属性とテーブル属性の継承

CREATE TABLE AS (CTAS) テーブルは、作成元のテーブルから制約、ID 列、デフォルトの列値、またはプライマリキーを継承しません。

CTAS テーブルの列圧縮エンコードは指定できません。Amazon Redshift では、次のように圧縮エンコードが自動的に割り当てられます。

  • ソートキーとして定義されている列には、RAW 圧縮が割り当てられます。

  • BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY、もしくは GEOGRAPHY の各データ型で定義されている列には、RAW 圧縮が割り当てられます。

  • SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP、または TIMESTAMPTZ として定義された列には AZ64 圧縮が割り当てられます。

  • CHAR、VARCHAR、または VARBYTE として定義されている列には、LZO 圧縮が割り当てられます。

詳細については、「圧縮エンコード」および「データ型」を参照してください。

列エンコーディングを明示的に割り当てるには、CREATE TABLE を使用します。

CTAS は、SELECT 句のクエリプランに基づいて新しいテーブルの分散スタイルとソートキーを決定します。

結合、集計、ORDER BY 句、LIMIT 句を含むクエリなど、複雑なクエリの場合、CTAS はクエリプランに基づいてベストエフォートで最適な分散スタイルとソートキーを選択します。

注記

大きいデータセットや複雑なクエリで最良のパフォーマンスを得るために、テストの際には、通常のデータセットを使用することをお勧めします。

多くの場合、クエリプランを調べて、クエリオプティマイザがデータのソートと分散に使用する列 (ある場合) を確認することにより、CTAS が選択する分散キーとソートキーを予測できます。クエリプランの最上位ノードが単一のテーブルからのシンプルなシーケンシャルスキャンである場合 (XN Seq Scan)、CTAS は通常ソーステーブルの分散スタイルとソートキーを使用します。クエリプランの最上位ノードがシーケンシャルスキャン以外である場合 (XN Limit、XN Sort、XN HashAggregate など)、CTAS はクエリプランに基づいてベストエフォートで最適な分散スタイルとソートキーを選択します。

例えば、次のタイプの SELECT 句を使用して 5 つのテーブルを作成するとします。

  • シンプルな SELECT ステートメント

  • Limit 句

  • LISTID を使用した ORDER BY 句

  • QTYSOLD を使用した ORDER BY 句

  • GROUP BY 句を使用した SUM 集計関数です。

次の例は、各 CTAS ステートメントのクエリプランを示しています。

explain create table sales1_simple as select listid, dateid, qtysold from sales; QUERY PLAN ---------------------------------------------------------------- XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=8) (1 row) explain create table sales2_limit as select listid, dateid, qtysold from sales limit 100; QUERY PLAN ---------------------------------------------------------------------- XN Limit (cost=0.00..1.00 rows=100 width=8) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=8) (2 rows) explain create table sales3_orderbylistid as select listid, dateid, qtysold from sales order by listid; QUERY PLAN ------------------------------------------------------------------------ XN Sort (cost=1000000016724.67..1000000017155.81 rows=172456 width=8) Sort Key: listid -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=8) (3 rows) explain create table sales4_orderbyqty as select listid, dateid, qtysold from sales order by qtysold; QUERY PLAN ------------------------------------------------------------------------ XN Sort (cost=1000000016724.67..1000000017155.81 rows=172456 width=8) Sort Key: qtysold -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=8) (3 rows) explain create table sales5_groupby as select listid, dateid, sum(qtysold) from sales group by listid, dateid; QUERY PLAN ---------------------------------------------------------------------- XN HashAggregate (cost=3017.98..3226.75 rows=83509 width=8) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=8) (2 rows)

各テーブルのディストリビューションキーとソートキーを表示するには、次に示すように PG_TABLE_DEF システムカタログテーブルのクエリを実行します。

select * from pg_table_def where tablename like 'sales%'; tablename | column | distkey | sortkey ----------------------+------------+---------+--------- sales | salesid | f | 0 sales | listid | t | 0 sales | sellerid | f | 0 sales | buyerid | f | 0 sales | eventid | f | 0 sales | dateid | f | 1 sales | qtysold | f | 0 sales | pricepaid | f | 0 sales | commission | f | 0 sales | saletime | f | 0 sales1_simple | listid | t | 0 sales1_simple | dateid | f | 1 sales1_simple | qtysold | f | 0 sales2_limit | listid | f | 0 sales2_limit | dateid | f | 0 sales2_limit | qtysold | f | 0 sales3_orderbylistid | listid | t | 1 sales3_orderbylistid | dateid | f | 0 sales3_orderbylistid | qtysold | f | 0 sales4_orderbyqty | listid | t | 0 sales4_orderbyqty | dateid | f | 0 sales4_orderbyqty | qtysold | f | 1 sales5_groupby | listid | f | 0 sales5_groupby | dateid | f | 0 sales5_groupby | sum | f | 0

結果の概要を次の表に示します。分かりやすいように、説明プランからコスト、行、幅の詳細を省略しています。

CTAS SELECT ステートメント

EXPLAIN プランの最上位ノード

分散キー

ソートキー

S1_SIMPLE

select listid, dateid, qtysold from sales

XN Seq Scan on sales ...

LISTID DATEID
S2_LIMIT

select listid, dateid, qtysold from sales limit 100

XN Limit ...

なし (EVEN) なし
S3_ORDER_BY_LISTID

select listid, dateid, qtysold from sales order by listid

XN Sort ...

Sort Key: listid

LISTID LISTID
S4_ORDER_BY_QTY

select listid, dateid, qtysold from sales order by qtysold

XN Sort ...

Sort Key: qtysold

LISTID QTYSOLD
S5_GROUP_BY

select listid, dateid, sum(qtysold) from sales group by listid, dateid

XN HashAggregate ...

なし (EVEN) なし

CTAS ステートメントでは、分散スタイルとソートキーを明示的に指定できます。例えば、次のステートメントは、EVEN 分散を使用してテーブルを作成し、ソートキーとして SALESID を指定します。

create table sales_disteven diststyle even sortkey (salesid) as select eventid, venueid, dateid, eventname from event;

圧縮エンコード

ENCODE AUTO は、テーブルのデフォルトになっています。Amazon Redshift は、テーブル内のすべての列の圧縮エンコードを自動的に管理します。

受信データの分散

受信データのハッシュ分散スキームが、ターゲットテーブルのスキームと同じ場合、データをロードするときに、データを物理的に分散させる必要はありません。例えば、新しいテーブルに分散キーが設定されており、同じキー列で分散されている別のテーブルからデータが挿入される場合、同じノードとスライスを使用してデータが所定の位置にロードされます。ただし、ソーステーブルとターゲットテーブルの両方が EVEN 分散に設定されている場合、データはターゲットテーブルで再分散されます。

自動 ANALYZE 操作

Amazon Redshift は、CTAS コマンドで作成したテーブルを自動的に分析します。最初に作成したとき、これらのテーブルに ANALYZE コマンドを実行する必要はありません。変更する場合は、他のテーブルと同じように分析する必要があります。