大きな (~50Gb、~300 mln 行) タブ区切りファイルがあり、列を持つ SQL Server テーブルにインポートしたい: char(10), varchar(512), nvarchar(512), nvarchar(512)
.
T-SQL、SSIS、または C# SqlBulkCopyクラスを使用して一括インポートするには、約 1 日かかります。
このデータをロードするより速い方法はありますか?
または、それを遅くする何らかの条件があり、それを削除または変更できますか?
大きな (~50Gb、~300 mln 行) タブ区切りファイルがあり、列を持つ SQL Server テーブルにインポートしたい: char(10), varchar(512), nvarchar(512), nvarchar(512)
.
T-SQL、SSIS、または C# SqlBulkCopyクラスを使用して一括インポートするには、約 1 日かかります。
このデータをロードするより速い方法はありますか?
または、それを遅くする何らかの条件があり、それを削除または変更できますか?
既存のテーブルに挿入する場合は、インポートする前にすべてのインデックスを削除し、インポート後にそれらを再作成します。
SSISを使用している場合は、バッチとコミットのサイズを微調整できます。
このような大規模なデータ負荷に対してサーバーに十分なメモリがあることを確認してください。
ローカルサーバーでロード操作を実行します(ファイルをローカルにコピーし、ネットワーク経由でロードしないでください)。
宛先データベースとトランザクションログの自動拡張オプションを、一度に数百MBのチャンクなどの適切な値に構成します(デフォルトでは、マスターデータファイル.mdfの場合は通常1MBずつ拡張されます)。成長操作は遅い/高価なので、これらを最小限に抑える必要があります。
データとログファイルが高速ディスク、できれば別々のLUNにあることを確認してください。理想的には、ログファイルをログファイルとは別のミラーリングされたLUNに配置する必要があります(オプションについては、ストレージ管理者またはホスティングプロバイダーに相談する必要がある場合があります)。
私はここ数週間、非常に大きな負荷を自分で最適化するのに苦労しました。BULK INSERT は、SSIS や TSQL Bulk Insert とは対照的に、BCP で見つけた最速の方法ですが、これを調整するためにできることがあります。
データを並行してロードしようとしましたか? 簡単な SSIS ソリューションを次に示します。
1) SSIS 行番号ジェネレーターをインストールします ( http://www.konesans.com/products/row-number-transformation.aspx ) 2) ファイルを読み取る SSIS パッケージを作成します。3) データ フロー タスクで、ソース ファイルを読み取ります。4) データ フロー タスクで、行番号ジェネレーターを挿入します。5) データ フロー タスクで、行番号を使用して複数のスレッドを作成する条件付き分割を挿入します (つまり、行番号 % 3 == 0、行番号 % 3 == 1、行番号 % 3 == 2)。6) データ フロー タスクで、ターゲットの宛先テーブルを挿入します。
お役に立てれば。