web-dev-qa-db-ja.com

テーブルへの挿入select * from table vs一括挿入

SQLステートメントINSERT INTO TABLE1 SELECT * FROM TABLE2が一括挿入と同じように機能することを知りたいだけです。

いいえの場合、レコードの挿入時にインデックスを除外する方法はありますか?プロセスは1回の実行で150ミリオンのデータを挿入しています。

ステージテーブル(インデックスTable1はありません)を作成し、ステージテーブルからターゲットテーブル(インデックスTable2を持つテーブル)に転送する予定です。

プロセスからフラットファイルを作成する状況ではありません。

しかし、Table1(インデックスなし)からTable2(インデックス付き)にデータを転送するときに、プロセスを高速化できるものを探しています。

BulkInsertTable1からTable2に使用する方法はありますか?

6
Virul Patel

あなたの最善の策は、[〜#〜] ssis [〜#〜]またはBULK INSERTを使用することです。それらを使用すると実行できるさまざまなパフォーマンス改善があり、それらは The Data Loading Performance Guide に非常によく文書化されています。

[〜#〜] ssis [〜#〜]レベルでは、以下の内容を調べて、データの読み取りとデータのロードを高速化できます。

  • Fast Parse オプションとその制限。
  • SQL Server Native Client 10.xを使用するOLE DBプロバイダーをインメモリの高性能接続に使用する
  • パケットサイズを32767に設定します。
  • OLE DB Destination Data Access mode“ Table or View – fast load”オプションを選択します

詳細については、「 SQL ServerへのSSIS一括挿入の高速化 」を参照してください。

BULK INSERT操作を改善するいくつかの良い方法を以下に示します。

  1. クエリヒントとしてTABLOCKを使用します。
  2. 一括読み込み操作中にインデックスを削除し、完了したらインデックスを再作成します。
  3. ロード操作中にデータベースの復旧モデルをBULK_LOGGEDに変更します。
  4. ターゲットにクラスター化インデックスがある場合、一括挿入操作でORDER BY句を指定すると、一括読み込みの速度が向上します。
  5. BULK INSERT操作の開始時にトレースフラグ610を使用する。

最大並列度は、デフォルトではなくサーバーで構成する必要があります。それをどのように構成するかについての私の回答を参照できます ここ

SQL Server 2014を使用している場合、 SELECT ... INTOは並列です

また、サーバー上でWait Statisticsを監視する必要があります。特にSOS_SCHEDULER_YIELDを実行すると、複数のCPUが同時にバルクロード操作を実行し、同じCPUサイクルで競合するサーバーでスケジューラの競合が発生します。

以下も参照してください。

14
Kin Shah

はい。 table2 select * from table1への挿入は、一括挿入と非常によく似ています。テーブルが同じである場合にのみ機能します。

0
Maria nardi