16.20 - INSERT ...SELECTリクエストの最適化 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQLデータ操作言語

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-162K-JPN
Language
日本語 (日本)

空のテーブルへのINSERT...SELECTリクエストとパフォーマンス

INSERT...SELECTは、ターゲット テーブルが空である場合にパフォーマンスが最適化されます。ターゲット テーブルにデータが入っていない場合、INSERT...SELECTはジャーナリングをバイパスしてブロックごとに効率的に実行します。

通常、システムでテーブルに行が挿入されるとき、対応するエントリがトランザクション ジャーナル(TJ)に作成されて、トランザクションがアボートした場合に行をロールバックできるようになります。
  • 空でないテーブルに挿入する場合、トランザクションがアボートすると、システムではTJで行ID(トランザクション関連のRowID)が検索され、テーブルからすべての挿入項目が1行ずつ削除されます。
  • 空のテーブルに挿入する場合、トランザクションがアボートすると、すべての行が削除されることにより、そのテーブルは簡単に最初の状態に復元されます。
最適化されたINSERT . . . SELECTを使用することには、以下の利点があります。
  • ブロック単位の処理
  • ブロック併合の複雑な処理がない、より高速な挿入ロジック
  • アボートした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を使用します。
  1. ステージング テーブルへのFastLoadを実行する。
  2. 必要に応じてデータを操作し、最終テーブルへ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と結合インデックス

結合インデックスを持つテーブルに対して挿入処理を行なう最速の方法は、以下のとおりです。
  1. FastLoadを使用してインデックスまたは結合インデックスが1つも定義されていないステージング テーブルに行をロードする
  2. ステージング テーブルから結合インデックスのあるターゲット テーブルにINSERT ...SELECTする。

ターゲット テーブルに複数の結合インデックスが定義されている場合、最適化ルーチンでは、結合インデックスの保守に際して再利用可能なスプールが使用されることがあります。