web-dev-qa-db-ja.com

複数のテーブルから同時に宛先テーブルに挿入するにはどうすればよいですか。

毎月約2,000のデータベースを復元し、データをテーブルに送り込んでからDBを削除するシングルスレッドプロセスがあります。挿入が完了するまでに約18時間かかります(SSISパッケージ経由)。このマルチスレッドを作成するにはどうすればよいですか。宛先テーブルでのロック/デッドロックの回避。パーティションの切り替えを考えましたが、宛先が宛先テーブルの1つのパーティションで終了する必要があるため、機能しません。

1
Rahim

This 記事はあなたのためです。

マルチスレッドの質問に関する直接の引用。

図2に示すように、並行して実行できる実行可能ファイルの数を決定するパッケージプロパティはMaxConcurrentExecutablesです。デフォルトは-1です。これは、制御フローエンジンがサーバー上の論理プロセッサの数に2を加えた数を使用することを意味します。クアッドコアサーバーでデフォルト設定でパッケージを実行している場合、最大6つの実行可能ファイルを並行して実行できます。

This 記事では、ブロックとロックの回避について説明し、調査するための独自の質問を提供するのに十分な例とアイデアを提供する必要があります。どのタイプのロックとブロックが発生し、どのレベルの分離が必要かを評価することは、ブロックとロックを回避するのに役立ちます。

デッドロックは、入力した内容に基づいて発生する問題のようには聞こえません。これが良い 説明 それがどのように発生するかについてです。

1
Shaulinator

明確にするために、次のような単一のSSISパッケージがあります。

  • 2000データベースのリストを復元します
  • これらの2000個のデータベースのそれぞれから、中央(永続)データベースのパーティションテーブルにデータを抽出してから、
  • ソースデータベースを削除しますか?

マルチコアサーバーで作業していると仮定すると、次の方法でパフォーマンスが大幅に向上すると思います。

  1. パッケージをコピーし、各パッケージがデータベースの等しいサブセットを担当するようにします(たとえば、10個のパッケージがそれぞれ200データベースを担当します)
  2. すべてが同時に開始される場合でも、個別のSQLエージェントジョブを介してそれぞれをスケジュールします。これらのジョブ/パッケージは同時に実行されます。これは「安価で簡単な」SQLマルチタスクの形式です。
  3. 復元はIOをめぐって競合しますが、互いにブロックするべきではありません
  4. インサートはテーブルアクセスをめぐって互いに競合する可能性があります。これを最適化するには、データコピー設定を試してみる必要があるかもしれません。
  5. 残りはSQLに任せてください。完了したパッケージは、他のタスク(データベースの削除、次のタスクの復元)に進むことができます。

あなたはそれを正しくするためにパッケージの数で遊ぶ必要があるかもしれません。

もう1つのアイデア:この月次インポートからのデータがこの月次パーティションテーブルの真新しい月を構成する場合は、すべての新しいデータを真新しい(空の)テーブルに確実にインポートし、「スライディングウィンドウ」手法を使用してロールします影響が0のメインテーブルに。 SQL Serverでのスライディングウィンドウの管理 を参照してください。

1
BradC