アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング ― 第4回 DBアプリケーションのパフォーマンス・チューニング 亀川 和史2011/11/15 |
|
Page1
Page2
|
●更新処理
以下では更新処理について解説する。
LINQ to Entitiesでの更新は数行程度であれば問題ないが、CSV形式のファイルを基に多くのレコードを追加および更新するような場合は、SQL ServerにはbcpユーティリティやSSISを使用した方がはるかに効率的だ。
また、データベースAのデータを基にしてデータベースBのデータを作成、更新するといったように、マスタから別のデータを作る場合も、ストアド・プロシージャを使用すれば、アプリケーション・サーバ側とデータベース・サーバ側で通信を発生させることもないため、性能面で有利になる。
例えば、100万件のCSVファイルを以下のようなデータベースのマスタ・データとして登録する場合を考えてみよう。
100万件のCSVファイルを登録するための、データベースのマスタ・データ・テーブル |
CSVファイルから1行ずつ読み込んでEntity Frameworkでデータを登録するようなプログラムは、下記のようになる。紙面の都合上、最低限のエラー・チェックしか行っていない。
|
|
CSVファイルから1行ずつ読み込んでEntity Frameworkでデータを登録するコード例 |
この処理でリモートのSQL Serverを登録先にすると、かなりの時間がかかる。正確にはSaveChangesメソッドを呼び出したタイミングでSQL Server側でコミット処理が走り、ここでかなり待つことになる。また、SQL Serverのトランザクション・ログの容量によっては更新処理が失敗するかもしれない。
SaveChangesメソッド(=データの登録)を適当なタイミング(1000行読み込んだタイミングで実行するなど)で呼び出せば、SaveChangesメソッドの処理時間を短くすることもできるが、処理中にエラーになった場合は一部登録されたレコードを削除する、もしくは、途中からデータ登録を再開するといった機能を組み込む必要がある。
こういったリモートSQL Serverへの大量のデータ登録時には、SQL Serverに付属している[データのインポートおよびエクスポート ユーティリティ](以下、SSIS)を使用する方が断然高速に行える。実際にやってみよう(以下の画面を参照)。64bit版と32bit版の2種類が用意されているが、どちらでもできることは同じである。
本稿の例ではクライアントにSQL Server 2008 R2 Express Editionを使っているため、[すぐに実行する]しか選択することができない。しかし、画面下部の注意書きにあるように、Standard以上のエディションではSQL Serverにパッケージとして登録して、SQL ServerのAgentタスクとして実行できる。例えば、定期的に外部からCSVファイルをデータベースに登録するような処理であればプログラムを作る必要はない。そういった処理を目的としたプログラムを作る前に、SSISを実際に試してみるとよいだろう。
SSISで先ほどと同じ1万行のデータを登録する場合、10秒程度で終了した。Entity Frameworkの先ほどのプログラムと比較すると、かなり高速に終了することが分かる。
業務アプリケーションでデータベースAからデータを読みながら、そのデータでデータベースBを更新するという処理も、同様にネットワークでデータのやり取りが発生するため、遅くなる。速度だけをポイントにするならばストアド・プロシージャに移行すれば高速化が期待できる。
■
次回はWebサービスのパフォーマンス・チューニングを説明する。
INDEX | ||
アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング | ||
第4回 DBアプリケーションのパフォーマンス・チューニング | ||
1.データ・アクセスについて:LINQとストアド・プロシージャ | ||
2.データ・アクセスについて:更新処理 | ||
「アプリケーションのギアを上げよう」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -