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 |
|
|
LISTID | DATEID |
S2_LIMIT |
|
|
なし (EVEN) | なし |
S3_ORDER_BY_LISTID |
|
|
LISTID | LISTID |
S4_ORDER_BY_QTY |
|
|
LISTID | QTYSOLD |
S5_GROUP_BY |
|
|
なし (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 コマンドを実行する必要はありません。変更する場合は、他のテーブルと同じように分析する必要があります。