CREATE TABLE AS

CREATE TABLE AS コマンドは、SELECT 文の結果に基づいて表を作成するために使用します。 このコマンド名は、CTAS に省略されることがあります。

CREATE TABLE AS コマンドには以下の特徴があります。
共通タスク
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 SELECTFROM tbl …;
t_two 表は、(tbl_one+tbl_two) の結合表 (これらの結合キー) から分散キーを継承するとします。
CREATE TABLE t_two AS SELECTFROM tbl_one,tbl_two … WHERE
tbl_one.b1 = tbl_two.b2 …
t_three 表は、グループ化ノード (b1、b2、b3) から分散キーを継承するとします。
CREATE TABLE t_three AS SELECTFROM tbl_one, tbl_two, tbl_three…
WHEREGROUP 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 変数を変更するには、以下の手順に従います。
  1. 標準エディターを使用して、構成ファイル nz/data/postgresql.conf を開きます。
  2. the enable_random_table_distribute = 0含む行を見つける。
  3. 変数を 0 から 1 に変更し、変更を保存します。
  4. 変更を有効にするには、Netezza Performance Serverシステムを再起動します。

構文

CREATE TABLE AS コマンドの構文
CREATE [ TEMPORARY | TEMP ] TABLE <table> [ (<col>[,<col>…] ) ]
AS <select_clause> [ DISTRIBUTE ON ( <dist_col>[,<dist_col>…] ) ]

入力

CREATE TABLE AS コマンドの入力は以下のとおりです。
表 1. CREATE TABLE AS の入力
入力 説明
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