| 2004年2月26日
『どっとねっとと雑多な日々 22』
皆さん、こんにちは。今回は、PASSJ Conference 2004 のデモの内容を紹介します。
< http://www.sqlpassj.org/conf2004/speaker.aspx#Begin02
>
相変わらず、時間配分を考えていなかったため、参加された方に申し訳ない
終わり方をしてしまったので、今後 pml-web のほうでもサポートさせていただきたいと思います。
DEMO に使用した環境
Windows XP Service Pack 1
SQL Server 2000 Service Pack 3a
Visual Studio .NET 2003 - C#
DEMO を実行したり再現させたりするための最低限の環境
.NET Framework 1.1
※ DEMO を Solution として開きたい場合は Visual Studio .NET 2003 が必要です。
ダウンロード
http://www.sqlpassj.org/conf2004/DEMO.lzh
セットアップ
DEMO.lzh を解凍し、DEMO\Setup.cmd を実行してください。
SQL Server 2000/"Yukon", MSDE 2000 で動作確認していますが、もしかすると
ほかの環境ではエラーになる場合がありますので、そのときはpml-web に投稿してください。
DEMO 1
System.Data.SqlClient.SqlConnection を使用して、SQL Server への接続を
コマンドラインアプリケーションとして作成しました。
コマンドラインから ConnectionString を入力させ、入力された情報を元に
SQL Server に接続します。
このとき、入力された ConnectionString が正しくない場合は、Exception
が発生しますので、それに対応する Try/Catch を記述しないと Exception
でアプリケーションがエラーになります。
DEMO 2
ストアドプロシージャを使用して、SELECT するサンプル。
ストアドプロシージャを実行する場合は SqlCommand.CommandType を
CommandType.StoredProcedure に必ず変更すること。
DEMO 3
SqlDataReader を利用して、複数 SQL を実行するサンプル。
取得した件数は SqlDataReader を開いた直後にはわからないので、開くと
同時に件数を取得できるようにするためのサンプルです。
複数の結果を移動するには SqlDataReader.NextResult() メソッドで移動します。
DEMO 4
SqlDataAdapter と DataSet を利用してデータソースからデータを取得し
たり、データを更新するサンプル。
「データアダプタ構成ウィザード」を使うと、デフォルトの場合はパフォーマンスを
悪化させるような SQL を生成してくれるという例。
DEMO 5
DEMO 4 をストアドプロシージャを使用するように変更し、パフォーマンスに対する
回避策のサンプル。
テーブルには TIMESTAMP 列を用意して、主キーと TIMESTAMP 列を WHERE
条件として、項目の更新をするという例です。
参照したときと更新したときに誰がデータを更新していた場合、アプリケーション上
問題になる場合があるときに、どのように回避するのかの一例。
DEMO 6
DEMO 5 の場合は誰でもデータの参照はできてしまうので、誰かが参照し
ている場合は、そのデータを参照させないというロジックを実装する場合のサンプル。
原理は、FROM TO で指定されたデータを参照させるときに、Watch フラグに値を入れて、
SELECT 時に Watch フラグが NULL のものだけ参照するように WHERE 条件を
設定するというもの。
DEMO 7
大量のデータ更新時に、現在の ADO.NET では INSERT/UPDATE/DELETE を
1 回 1 回 SQL を発行するので、非常にボトルネックになっています。
それを回避するには、自前で複数の SQL を生成するようにして、一回の
ExecuteNonQuery で実行すれば、パフォーマンスがよくなるという例です。
この機能は ADO.NET V2.0 になれば実装されますが、今現在実装されてい
ませんので、もし SqlDataAdapter と DataSet で大量データ更新を行って
いる方がいましたら、こちらのサンプルを参考にパフォーマンス改善を行ってください。
最後に
Visual Studio .NET で用意されているウィザードや ADO.NET は生産性は
非常に高いものがありますが、これがパフォーマンスに優れているかというと
そうでもありません。
.NET アプリケーションにしたらパフォーマンスが悪くなったなどという
こともありますので、なぜ遅くなるのかの理由を理解した上で、
パフォーマンスを追及するには SQL プロファイラを活用していただければと思います。
|