創屋ぷれす

SQLServer間で大量のデータを高速同期

サーバとクライアントにインストール済みのSQLServer間で大量のデータを転送(同期)する必要があり、少し調べてみました。

  • DTS
  • bcp(またはSqlBulkCopy)
といったあたりが使えるそうです。
今回はプログラム内から処理が必要なので、.NET FrameworkのSqlBulkCopyというクラスを検証してみました。
SqlBulkCopyクラス

環境は以下の通り。
社内LAN接続
サーバ:SQL Server 2000
クライアント:SQL Server Express 2005
データ: 約14万行

サーバからSqlDataReaderで読み込んで、SqlBulkCopyでクライアントへ全データコピーに約12秒。
同じく、クライアントからサーバへの全データコピーに約90秒。
サーバ側からは満足の行く速度かな。実際にはもっとデータ量は減るはず。
クライアント側からの転送が遅いのはPC、OSの性能差?クライアントからサーバへはさらにデータ量が少ないのであまり問題にはならないかな。

課題が1つあって、INSERTしかできない点。既に同じPKのレコードがあると制約違反になります。
解決方法は海外のサイトで検索すると、一時テーブルなり同期用のテーブルなりを用意して必要なデータをBulkCopy。
その後、ストアドプロシージャでINSERT、UPDATEの処理をすれ、とのこと。
Looking for a SqlBulkCopy that can do UPDATE…

同じインスタンス内であればTransact-SQLのINSERT SELECTのほうがBulkCopyよりも高速とMicrosoftのヘルプに書いてあるので、この組み合わせで検証中です。

Comments are closed.