CREATE TABLE AS
CREATE TABLE AS コマンドは、SELECT 文の結果に基づいて表を作成するために使用します。 このコマンド名は、CTAS に省略されることがあります。
- 共通タスク
- CREATE TABLE AS コマンドは、表を作成し、select コマンドからのデータを以下のように挿入します。
- 表列には、SELECT コマンドの出力列に関連付けられた名前とデータ型を割り当てます。ただし、新規列名のリストを明示的に指定されている場合は、これらの列名を優先します。
- CREATE TABLE AS コマンドは、表を作成し、照会を一度評価した結果を使用してこの新規表を初期化します。 新規表は、それ以降に照会のソース表が変更されても追従しません。 一方、ビューを照会する場合には、常に、基本となる SELECT コマンドが再評価されます。
- 小規模な CTAS の自動統計の停止
- CTAS オペレーション中、Netezza Performance Serverは通常 CTAS オペレーションの後に GENERATE STATISTICS を実行して、作成されたテーブルの統計情報を収集します。 しかし、表の照会が短ければ、CTAS 処理そのものよりも GENERATE STATISTICS 処理の方に時間がかかる場合があります。
CTAS 処理が実行されると、表の作成と挿入処理が行われます。 挿入操作中、Netezza Performance Serverはすべての列の最小値、最大値、ゾーンマップを計算します。 挿入操作で生成された行数が設定したしきい値(ctas_auto_stats_min_rows)より少ない場合、Netezza Performance Serverは統計の生成操作をスキップします。
この機能を制御する postgresql.conf ファイル設定には以下の 2 つがあります。- enable_small_ctas_autostats は、小規模表の自動統計を停止する機能を有効または無効にします。 この設定はデフォルトで有効になっています。
- ctas_autostats_min_rows は小規模表のしきい値を指定します。 Netezza Performance Serverは、この閾値未満のテーブルの統計情報を計算しません。 デフォルト値は 10000 です。
- 分散キーの取り扱い
- 明示的な分散キーを定義しない場合、CTAS 表は親表から分散キーを継承します。 一般に、ターゲット表の分散は、プランの最終ノードによって定義されます。 最終ノードに有効な分散がある場合、システムはその分散を CTAS のターゲットに割り当てます。 最終プランのノードに分散がない場合 (ホストでのノードと同様) のみ、システムは表の最初の列をデフォルトに設定します。
分散キーのデフォルトは最初の列であり (ハッシュ分散)、ここでは認識可能な分散キーがないか、CTAS 表に対するソース・ストリームがラウンドロビン分散となっています。
t_one 表は f_one から分散キーを継承します (最初の列にはデフォルト設定されていません)。CREATE TABLE t_one AS SELECT … FROM tbl …;
t_two 表は、(tbl_one+tbl_two) の結合表 (これらの結合キー) から分散キーを継承するとします。CREATE TABLE t_two AS SELECT … FROM tbl_one,tbl_two … WHERE tbl_one.b1 = tbl_two.b2 …
t_three 表は、グループ化ノード (b1、b2、b3) から分散キーを継承するとします。CREATE TABLE t_three AS SELECT … FROM tbl_one, tbl_two, tbl_three… WHERE … GROUP BY b1,b2,b3;
- 表分散のシステム・デフォルト
- postgresql.conf の設定 enable_random_table_distribute は、表作成時のデフォルトの分散動作を制御します。 デフォルト値 0 (使用不可) は以下の動作を指定します。これは、以前のリリースで表が作成される際のデフォルトの動作です。
- CREATE TABLE の動作:
- DISTRIBUTE ON が指定されている場合は、指定された分散メカニズムを使用します。
- DISTRIBUTE ON が指定されていない場合は、最初の列をデフォルトの分散キーとして使用します。
- CREATE TABLE AS (CTAS) の動作:
- DISTRIBUTE ON が指定されている場合は、指定された分散メカニズムを使用します。
- DISTRIBUTE ON が指定されていない場合は、プランから分散キーを継承します。 プランナーがプランから分散を判定できない場合は、最初の列をデフォルト・キーとして使用します。
enable_random_table_distribute=1 (使用可能) と指定すると、システムの動作が以下のように変わります。- CREATE TABLE の動作:
- DISTRIBUTE ON が指定されている場合は、指定された分散メカニズムを使用します。
- DISTRIBUTE ON が指定されていない場合は、分散方式としてランダムを使用します。
- CREATE TABLE AS (CTAS) の動作:
- DISTRIBUTE ON が指定されている場合は、指定された分散メカニズムを使用します。
- DISTRIBUTE ON が指定されていない場合は、プランから分散キーを継承します。 プランナーがプランから分散を判定できない場合は、分散方式としてランダムを使用します。
場合によっては、プランナーがプランから分散を判定できないことがあります。 例:- ホストで最終結合が行われると、その結合の結果の分散が非決定論的になります。
- <select-list> で分散列が欠落している場合は、分散が非決定論的になります。
- 最終結果ノードの分散がランダムである場合は、分散が非決定論的と見なされます。
- 最終結合が全外部結合である場合も、分散が非決定論的になります。
この変更により、従来のリリースでこの動作を制御していた NZ_DISABLE_SKEW_DEFENSE 環境変数が廃止されました。 リリース 4.6 へのアップグレード時にはこの変数の存在が検査され、これが設定されている場合は、その値に対応する値を使用して enable_random_table_distribute が設定されます。
postgresql.conf 変数を変更するには、以下の手順に従います。- 標準エディターを使用して、構成ファイル nz/data/postgresql.conf を開きます。
the enable_random_table_distribute = 0
含む行を見つける。- 変数を 0 から 1 に変更し、変更を保存します。
- 変更を有効にするには、Netezza Performance Serverシステムを再起動します。
- CREATE TABLE の動作:
構文
CREATE [ TEMPORARY | TEMP ] TABLE <table> [ (<col>[,<col>…] ) ]
AS <select_clause> [ DISTRIBUTE ON ( <dist_col>[,<dist_col>…] ) ]
入力
入力 | 説明 |
---|---|
TEMPORARY または TEMP | 一時表を作成します。 |
<table> | 作成する表の名前。 一時表には、既に存在している永続表と同じ名前を付けられますが、他のテーブル名は、データベースのスコープ内で固有でなければなりません。 |
<col> | 新しい表内の列の名前。 列名を指定しない場合、名前は select 節の出力列名から取得されます。 |
<select_clause> | SELECT (行を取り出す) で説明した SELECT コマンド。 |
<dist_col> | 分散列の名前。 ディストリビューション・カラムの詳細については、Privilegesの「ディストリビューション・キーの取り扱い」を参照のこと。 |
出力
出力メッセージの一覧については、CREATE TABLE コマンドおよび SELECT コマンドを参照してください。
特権
admin ユーザーか、データベースかスキーマの所有者であるか、Create Table 特権を持っている必要があります。 SELECT 文で使用する表に対する Select 特権も必要です。
使用法
以下に使用例を示します。
cows
という名前の以下の表について考慮します。cnumber | cname | cbreed | ckind ---------+--------+-------------+------- 3 | Cindy | Ayrshire | milk 8 | Muffin | Guernsey | milk 2 | Martha | Brown Swiss | milk 7 | Joe | Angus | beef 5 | Gretel | Highland | beef 1 | Betsy | Holstein | milk 6 | Bob | Angus | beef 4 | Mindy | Hereford | beef 9 | Milda | Jersey | milk
表cows
の 2 つの列から表を作成します。MYDB.SCH1(USER)=> CREATE TABLE cows2 AS SELECT cname, cbreed FROM cows;
その結果として、以下のようにcows2
という名前の新しい表が得られます。MYDB.SCH1(USER)=> SELECT * FROM cows2; cname | cbreed --------+------------- Cindy | Ayrshire Muffin | Guernsey Mindy | Hereford Milda | Jersey Betsy | Holstein Gretel | Highland Martha | Brown Swiss Joe | Angus Bob | Angus