| 2004年1月29日
『どっとねっとと雑多な日々 20』
皆さん、こんにちは。
さて、皆さんは Visual Studio .NET に用意されている「データアダプタ構成ウィザード」を使っていますか?
私はほとんど使いません。
セミナーなどのデモではたまに見せることがありますが、基本的には使わないことにしています。
それはなぜか。
1.「データアダプタ構成ウィザード」で生成される DataAdapter と Connection は
対象の Form 固有のオブジェクトとして生成されるため。
2.生成される SQL が非常に高コストだから。
3.DataAdapter での追加・更新・削除は一行単位で処理されるためにパフォーマンスが悪い。
という理由だからです。
たとえば pub.dbo.titles というテーブルを「データアダプタ構成ウィザード」
を使って SqlDataAdapter を作ってみると
SelectCommand1
InsertCommand1
UpdateCommand1
DeleteCommand1
などが自動的に生成されます。
ここで注目してほしいのが
UpdateCommand1
DeleteCommand1
なのですが、たとえば UpdateCommand1 の CommandText を見てみると
UPDATE titles SET 省略
WHERE (title_id = @Original_title_id) AND (advance = @Original_advance
OR @Original_advance IS NULL AND advance IS NULL) AND (notes =
@Original_notes OR @Original_notes IS NULL AND notes IS NULL)
AND (price
= @Original_price OR @Original_price IS NULL AND price IS NULL)
AND
(pub_id = @Original_pub_id OR @Original_pub_id IS NULL AND pub_id
IS
NULL) AND (pubdate = @Original_pubdate) AND (royalty = @Original_royalty
OR @Original_royalty IS NULL AND royalty IS NULL) AND (title =
@Original_title) AND (type = @Original_type) AND (ytd_sales =
@Original_ytd_sales OR @Original_ytd_sales IS NULL AND ytd_sales
IS
NULL)
などというとんでもない SQL が生成されます。
これだとインデックスがいくつあっても足りないし、IS NULL なので意味がないというのもあります。
「データアダプタ構成ウィザード」の「詳細オプション」にある「オプティミスティック同時実行制御」にチェックが入っている(デフォルト)と上記のような
Update 文が生成されます。
こちらのオプションをはずすと
UPDATE titles SET title_id = @title_id, title = @title, type
= @type,
pub_id = @pub_id, price = @price, advance = @advance, royalty
= @royalty,
ytd_sales = @ytd_sales, notes = @notes, pubdate = @pubdate WHERE
(title_id = @Original_title_id)
比較的マイルドな SQL が生成されます。
でも、これでは後からの更新が有効になってしまいます。
それではどうするのか?
一般的には Timestamp 列を使って、その行が更新されていないかを判断するべきだと考えています。
ただし、これはテーブルレイアウトを変更することになりますので、許可されない場合は、自前でロックテーブルなどを作成するなど、込み入ったことをしないと実現できないと思います。
#そっちを作るほうが労力を使うことになります。
最後に、ウィザードはかなり強力な機能ですが、それがどういうものを生成されるのかを一度確認して、問題がありそうであれば、自前で変更するぐらいの心構えをしておかないと高負荷なシステムの場合、レスポンスが悪くなるケースがありますので注意してください。
|