2009/12/12

Bulk merge 報告

前々回のエントリーで宿題状態になっていた Bulk Mergeのコストの件です。
結論から書くと、「想定したテストケースでは、Bulk Mergeを適用できない」でした。

Bulk Mergeの書式は、

MERGE INTO 都道府県 A USING OPENROWSET( BULK 'd:\wk\都道府県.csv'
,FORMATFILE = 'd:\wk\都道府県.fmt' ) B
ON A.code = B.code
WHEN MATCHED THEN UPDATE SET A.name = B.name
WHEN NOT MATCHED THEN INSERT VALUES ( B.code , B.name);

です。直感的に理解できます。
(*) create table 都道府県
( code char(2) primary key,
name varchar(10)
)
とします。

CSV Fileの書式をFORMATFILEで指定してあげる必要があります。
当初、この書式を手作業で作成するものだと思っていて、手間取ったのですが、よくよく読むと、bcp機能でテーブルから自動作成してくれるではありませんか!!

bcp __検証.dbo.都道府県 format nul -T -c -t "," -f d:\wk\都道府県.fmt

これで、Bulk Mergeの準備は整いました。いざテスト。GO。

一意キーエラーで落ちる!!
なんで、落ちるの?、重複すれば置換してくれるのではないの?。

最小データでテストしてみました。

  11,東京
  22,大阪
問題なくOK.

  11,東京
  22,大阪
  11,福岡
重複キー違反で落ちる....なんで???

bulk Mergeの元データ(CSV)内に重複キーのデータがあるときは、重複エラーを起こすようです。
なので、「郵便番号CSVから都道府県表を作る」というシナリオが成立しませんでした。
便利な構文でも制限はあるものですね。久々にハマりました。

視点を変えて、純粋に Bulk mergeのコストを計ろうとしたのでが、郵便番号CSV_Fileは 癖の強いデータでして、郵便番号がユニークじゃないのです。
地域名が長すぎる行は、複数行に割って格納されているので、このような構造になっています。
まずは、Bulk Mergeで使える CSVに整形するところからやって、後日エントリーします。

0 件のコメント:

コメントを投稿