空のテーブルへのINSERT...SELECTリクエストとパフォーマンス
INSERT...SELECTは、ターゲット テーブルが空である場合にパフォーマンスが最適化されます。ターゲット テーブルにデータが入っていない場合、INSERT...SELECTはジャーナリングをバイパスしてブロックごとに効率的に実行します。
- 空でないテーブルに挿入する場合、トランザクションがアボートすると、システムではTJで行ID(トランザクション関連のRowID)が検索され、テーブルからすべての挿入項目が1行ずつ削除されます。
- 空のテーブルに挿入する場合、トランザクションがアボートすると、すべての行が削除されることにより、そのテーブルは簡単に最初の状態に復元されます。
- ブロック単位の処理
- ブロック併合の複雑な処理がない、より高速な挿入ロジック
- アボートしたINSERT ... SELECTに対する即時のロールバック。
例: INSERT ... SELECT
複数の「Regional Sales History」テーブルを使用して、異なる地域のサマリーを結合することにより、単一のサマリー テーブルを作成します。 次に、複文INSERT ... SELECT文を使用して、これらのサマリーを単一テーブルに挿入します。
すべての複文INSERT...SELECT文は、同じスプール テーブルに出力します。出力はソートされて、以下に示すように空のテーブルに挿入されます。
複文リクエストは、以下のようにBTEQ内にセミコロンを入れるか、または単一のマクロ内に複数の文を入れることによって作成します。
INSERT into Summary_Table SELECT store, region,sum(sales),count(sale_item) FROM Region_1 GROUP BY 1,2 ;INSERT into Summary_Table SELECT region2, sum (sales), count(sale_item) FROM Region_2 GROUP BY 1,2 . . . ;INSERT into Summary_Table SELECT region3, sum(sales), count(sale_item) FROM Region_N GROUP BY 1,2;
空のSETテーブルへのINSERT ... SELECT
重複行がないことが分かっているソースから空のSETテーブルにINSERT . . .SELECTを実行すると、挿入中に行なわれるターゲット テーブルの重複検査がなくなります。 これは、別のSETテーブルから直接挿入する場合にも生じます。
NUPIが相対的に非固有であるか、または非常に非固有度の高い値がほとんどない場合、この方法によりパフォーマンスが大幅に改善されます。
INSERT . . . SELECTとFastLoad
- ステージング テーブルへのFastLoadを実行する。
- 必要に応じてデータを操作し、最終テーブルへINSERT...SELECTする。
FastLoadとINSERT ...SELECTはINMODを使用するよりも高速にホスト上のデータを管理します。これは、ホストが単一のボトルネックであるのに対し、並列AMPはレポートや中間結果のための一時テーブルを配置するためです。
複数のソース テーブルから同じターゲット テーブルに挿入することができます。リクエストが開始される前のターゲット テーブルが空の場合、そのリクエスト内のすべてのINSERT...SELECT文は最適化されたモードで実行されます。
ステージング テーブルは、プライマリ インデックスなしのNoPI(プライマリ インデックスなし)テーブルにできます。NoPIテーブルでは、ステージング テーブルのように行がハッシュ化されて配置されません。FastLoadの速度は、NoPIテーブルに挿入する場合のほうが速くなります。これは、ソートや行の再配置が必要ないためです。行は単純に、すべてのAMP間で均等にテーブルに追加されます。
NoPIは、プライマリ インデックスを持たない中間テーブル内でのスキューを減らし、ステージング テーブルにおいて便利です。ただし、NoPIテーブルの行はハッシュに基づいていないため、NoPIテーブルからPIテーブルへのINSERT/SELECTは、テーブル内で同じPI定義を共有するINSERT/SELECTより遅くなります。中間テーブルを多く生成するBIツールやアプリケーションでNoPIテーブルの使用を検討してください。
INSERT ...SELECTをNoPIテーブルからPIテーブルに対して実行する場合、INSERT ...SELECTを同じ PIのPI テーブルからPIテーブルに対して実行する場合に比べて遅くなる可能性があります。
INSERT . . . SELECTと結合インデックス
- FastLoadを使用してインデックスまたは結合インデックスが1つも定義されていないステージング テーブルに行をロードする
- ステージング テーブルから結合インデックスのあるターゲット テーブルにINSERT ...SELECTする。
ターゲット テーブルに複数の結合インデックスが定義されている場合、最適化ルーチンでは、結合インデックスの保守に際して再利用可能なスプールが使用されることがあります。