都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

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

f:id:koogucc11:20131104223604p:plain

 exportfile.txt に全件格納できました。

f:id:koogucc11:20131104224230p:plain

 次に、bcp コマンドでインポート処理をしてみましょう。その前に TRUNCATE 文で対象テーブルのテーブルデータをクリアしておきます。

TRUNCATE TABLE dbo.FactProductInventory

 また、bcp コマンドでデータインポートするには、下記のコマンドを実行します。

bcp AdventureWorksDW2012.dbo.FactProductInventory in "C:\exportfile.txt" -c -S localhost -T

f:id:koogucc11:20131105110517p:plain

 776,286件をインポートするのに、60秒程度かかりました。

f:id:koogucc11:20131105110832p:plain

 次に、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')

f:id:koogucc11:20131105111234p:plain

 42秒程度で処理が完了しています。

f:id:koogucc11:20131105111450p:plain

 bcp と BULK INSERT を比較すると、18秒程度の差がありました。この差は、bcp コマンドは独立したプロセス且つ SQL Server との認証など必要である点などが原因なのでしょうか。( BULK INSERT は T-SQL なので、SQL Server の内部プロセスで動作するスレッドであり、認証も必要としません。 )

f:id:koogucc11:20131104225131p:plain

 bcp コマンドは、エクスポート処理のみに使用して、インポート処理は BULK INSERT という組み合わせがいいんでしょうか?