1

大きな (~50Gb、~300 mln 行) タブ区切りファイルがあり、列を持つ SQL Server テーブルにインポートしたい: char(10), varchar(512), nvarchar(512), nvarchar(512).

T-SQL、SSIS、または C# SqlBulkCopyクラスを使用して一括インポートするには、約 1 日かかります。

このデータをロードするより速い方法はありますか?

または、それを遅くする何らかの条件があり、それを削除または変更できますか?

4

3 に答える 3

2

既存のテーブルに挿入する場合は、インポートする前にすべてのインデックスを削除し、インポート後にそれらを再作成します。

SSISを使用している場合は、バッチとコミットのサイズを微調整できます。

このような大規模なデータ負荷に対してサーバーに十分なメモリがあることを確認してください。

ローカルサーバーでロード操作を実行します(ファイルをローカルにコピーし、ネットワーク経由でロードしないでください)。

宛先データベースとトランザクションログの自動拡張オプションを、一度に数百MBのチャンクなどの適切な値に構成します(デフォルトでは、マスターデータファイル.mdfの場合は通常1MBずつ拡張されます)。成長操作は遅い/高価なので、これらを最小限に抑える必要があります。

データとログファイルが高速ディスク、できれば別々のLUNにあることを確認してください。理想的には、ログファイルをログファイルとは別のミラーリングされたLUNに配置する必要があります(オプションについては、ストレージ管理者またはホスティングプロバイダーに相談する必要がある場合があります)。

于 2012-10-16T19:39:06.053 に答える
2

私はここ数週間、非常に大きな負荷を自分で最適化するのに苦労しました。BULK INSERT は、SSIS や TSQL Bulk Insert とは対照的に、BCP で見つけた最速の方法ですが、これを調整するためにできることがあります。

  • CPU とメモリの間でリソースのプレッシャーを移動するために、バッチ設定ごとに行数を増減してみてください (高くすると CPU が減少し、低くするとメモリが減少します)。
  • クラスター化インデックスがある場合、または非クラスター化インデックスはそれらを削除し、挿入後に再作成します
  • .NET ツールを使用して TSV を小さなファイルに分割し、それらをテーブルに並列に読み込みます。これには、テーブルがヒープである必要があります (クラスター化されたインデックスが削除されました)
  • 最小限のログが記録されていることを確認してください。ヒープの場合、これには TABLOCK が必要です。クラスター化インデックスの場合は、トレース フラグ 610 が必要であり、クラスター化インデックス キーと同じ順序のデータ ローブが必要です。SIMPLE または BULK LOGGED リカバリ モデルのいずれかが必要になります。
于 2012-10-16T19:41:50.397 に答える
0

データを並行してロードしようとしましたか? 簡単な SSIS ソリューションを次に示します。

1) SSIS 行番号ジェネレーターをインストールします ( http://www.konesans.com/products/row-number-transformation.aspx ) 2) ファイルを読み取る SSIS パッケージを作成します。3) データ フロー タスクで、ソース ファイルを読み取ります。4) データ フロー タスクで、行番号ジェネレーターを挿入します。5) データ フロー タスクで、行番号を使用して複数のスレッドを作成する条件付き分割を挿入します (つまり、行番号 % 3 == 0、行番号 % 3 == 1、行番号 % 3 == 2)。6) データ フロー タスクで、ターゲットの宛先テーブルを挿入します。

お役に立てれば。

于 2013-07-17T04:46:38.370 に答える