18

私の会社は、寄生虫になった共生パートナーシップによって呪われています。パラサイトからデータを取得するには、非常に遅い odbc 接続を使用する必要があります。私は最近、(同じテーブルでも) クエリを並行して実行することで、より多くのスループットを得ることができることに気付きました。

データを抽出してローカル テーブルに移動したい特に大きなテーブルがあります。クエリを並行して実行すると、データをより速く取得できますが、これにより、複数のクエリから同じテーブルに一度にデータを書き込もうとすると問題が発生する可能性があることも想像できます。

クエリを並行して使用することで速度が向上したことを利用できるように、この状況を最も適切に処理する方法について、どのようなアドバイスをいただけますか?

編集:ここでいくつかの素晴らしいフィードバックを受け取りましたが、リンクされたサーバー (odbc ドライバーを使用) を介してデータをプルしているという事実が完全に明確ではなかったと思います。つまり、通常の INSERT ステートメントを実行でき、SqlBulkCopy や BULK INSERT よりも優れたパフォーマンスが得られると思います (実際には、BULK INSERT がオプションになるとは思いません)。

4

3 に答える 3

13

Load 1TB in less than 1 hourを読みましたか?

  1. 使用可能な CPU と同じ数のロード プロセスを実行します。32 個の CPU がある場合は、32 個の並列ロードを実行します。8 つの CPU がある場合は、8 つの並列ロードを実行します。
  2. 入力ファイルの作成を制御できる場合は、並列に実行するロード スレッドの数で割り切れるサイズにします。また、スイッチ パーティション戦略を使用する場合は、すべてのレコードが 1 つのパーティションに属していることを確認してください。
  3. SQL Server マシンでプロセスを実行している場合は、BCP の代わりに BULK 挿入を使用します。
  4. テーブル分割を使用して、さらに 8 ~ 10% を取得します。ただし、入力ファイルが分割関数と一致することが保証されている場合、つまり、1 つのファイル内のすべてのレコードが同じパーティションにある必要がある場合に限ります。
  5. 行ごとのロックを回避するには、TABLOCK を使用します。
  6. 複数のストリームを 1 つのテーブルにインポートする場合は、ROWS PER BATCH = 2500、またはこれに近い値を使用します。

SQL Server 2008 の場合、標準の INSERT SELECT に最小限のログを利用できる特定の状況があります。

SQL Server 2008 では、最小限のログで処理できる方法が強化されています。最小ログの通常の INSERT SELECT ステートメントをサポートします。さらに、トレース フラグ 610 をオンにすると、SQL Server 2008 は、新しいページの割り当てを引き起こす新しいキー範囲について、空でない B ツリーに対して最小限のログをサポートできます。

于 2012-06-19T06:01:51.857 に答える
5

コード、つまり c# でこれを行う場合は、SqlBulkCopy(System.Data.SqlClient 名前空間で) 使用するオプションがあり、この記事では、これを並行して行うことが可能であることを示唆しています。

http://www.adathedev.co.uk/2011/01/sqlbulkcopy-to-sql-server-in-parallel.html

于 2012-06-21T08:30:13.917 に答える