SQL Server の BCP と BULK INSERT のスピードを確認してみた
bcp コマンドと BULK INSERT ってどっちを使うべきなんでしょうか?今まではあまり気にせず、インポートおよびエクスポートに bcp コマンドを使っていました。BULK INSERT ってどうなんでしょうか?
bcp コマンドとは、CSV データの一括インポートおよびテーブルデータの一括エクスポートを行うコマンドのことです。コマンドプロンプトから実行します。試しに、bcp コマンドを使って、データをエクスポートしてみましょう。いつも検証で使用している Windows Azure 上に構築している AdventureWorks のテーブルデータを抽出します。AdventureWorksDW2012 の dbo.FactProductInventory テーブルデータを C:\exportfile.txt に全件格納します。下記のコマンドを実行します。
bcp AdventureWorksDW2012.dbo.FactProductInventory out "C:\exportfile.txt" -c -S localhost -T
exportfile.txt に全件格納できました。
次に、bcp コマンドでインポート処理をしてみましょう。その前に TRUNCATE 文で対象テーブルのテーブルデータをクリアしておきます。
TRUNCATE TABLE dbo.FactProductInventory
また、bcp コマンドでデータインポートするには、下記のコマンドを実行します。
bcp AdventureWorksDW2012.dbo.FactProductInventory in "C:\exportfile.txt" -c -S localhost -T
776,286件をインポートするのに、60秒程度かかりました。
次に、BULK INSERT を試してみます。BULK INSERT はテキストデータをインポートする T-SQL のコマンドです。その名の通り、INSERT しかできません。インポート機能としては、bcp コマンドとほぼ同様です。BULK INSERT でデータをインポートするには、下記の T-SQL 文を SQL Server Management Studio で実行します。
USE AdventureWorksDW2012 BULK INSERT AdventureWorksDW2012.dbo.FactProductInventory_old FROM "C:\exportfile.txt" WITH (FIELDTERMINATOR = ' ', ROWTERMINATOR = '\n')
42秒程度で処理が完了しています。
bcp と BULK INSERT を比較すると、18秒程度の差がありました。この差は、bcp コマンドは独立したプロセス且つ SQL Server との認証など必要である点などが原因なのでしょうか。( BULK INSERT は T-SQL なので、SQL Server の内部プロセスで動作するスレッドであり、認証も必要としません。 )
bcp コマンドは、エクスポート処理のみに使用して、インポート処理は BULK INSERT という組み合わせがいいんでしょうか?