- - PR -
ADO.Netからのストアド実行処理が極端に遅い
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-05-24 13:17
VisualC#2005 + SQLServer2005 でGUIアプリを作成していますが、
C#側(ADO.Net)からのストアド実行処理時間が極端に遅く、 悩まされています。 テンポラリテーブルにINSERTするストアドを使用しているのですが、 SQLServer Management Studio から実行すると処理時間2分であるのに対し、 C#側(ADO.Net)から実行すると処理時間が60分程度に膨れ上がってしまいます。 接続オプションで指定しているものは、 command.CommandTimeout = 0; //タイムアウトしない だけであり、 ストアドのパラメータに差異はありません。 SQLServer Management Studio から実行した場合も、 C#側(ADO.Net)から実行した場合も、INSERT結果は同じです。 色々調べてみましたが原因がわからず、お手上げ状態になってしまっています。。。 この様な場合、何が原因と考えられますでしょうか? よろしくご教示お願いします。 [ メッセージ編集済み 編集者: Dai 編集日時 2007-05-24 13:44 ] | ||||
|
投稿日時: 2007-05-24 13:50
ボトルネックがドコにあるのかはDaiさんにしか分かりません。
処理時間を正確に計測するには?辺りも含めて時間計測をしてボトルネックが1〜3のどれにあるか調べて下さい。 (ボトルネックが分かったら大体、解決すると思いますが) 1、クライアントプログラム 2、ADOからDBの通信(クライアント・サーバー間通信) 3、DB | ||||
|
投稿日時: 2007-05-24 14:23
未記入さん、レスありがとうございます。
ストップウォッチクラスは使用していませんが、 以下の方法でストアド実行時間を取得しています。
何度か実行し、平均して1時間程度かかります。 しかし、Management Studioから同ストアドを実行すると、 2分程度で処理終了します。 処理結果(INSERT内容)は同じです。 クライアントプログラムはストアド実行部以外に重い処理は無いので、 1、3ではなく、 「2、ADOからDBの通信(クライアント・サーバー間通信)」 がボトルネックであると考えています。 ADO から実行すると、Management Studio からの実行と比較して、 30倍も時間がかかっているのですが、この様な現象は稀にでもあるもの なのでしょうか?? | ||||
|
投稿日時: 2007-05-24 14:59
IN(SQL文)が長いとかストアドからのOUTが大きいとかはありますか?
比較調査として、 SQL文が短いストアド、ストアドからのOUTが小さいストアド、あとは〜ストアドの中身が空のストアドを呼び出してみて細かく切り分けてみるしかないですかね。 google先生←この辺はもう見てますよね? | ||||
|
投稿日時: 2007-05-24 15:36
レスありがとうございます。
パラメータは31個あります。 ストアドからのOUTは、1行2カラム分のデータ(挿入日付、挿入行数)だけです。 今回問題にしているストアドはINSERT用ですが、 他で使用しているSELECT用ストアドは、Management Studio と ADO で実行速度に差異はありません。 教えて頂いたURL、まだ見ていないページがありました。 良く読んでみます、ありがとうございます。 | ||||
|
投稿日時: 2007-06-24 16:25
私もこの問題で悩んでおります。
環境はSQLServer2000、VS2003、C#(ASP.NET)です。 クエリーアナライザから実行すると30秒程度で処理が終わるのですが WEB画面上からADO.NET経由で実行すると3分程度かかってしまいます。 SQLプロファイラで確認したところ一時テーブルへのインサートで 処理が著しく遅延していることがわかりました。(ストアドのリコンパイル も発生しております) 未記入さんの 「google先生←この辺はもう見てますよね?」 等色々調べたのですがいっこうに解決しません。 どなたか有益な情報がありましたら教えてください。 | ||||
|
投稿日時: 2007-06-24 22:37
31個もパラメータのあるストアドということなので、
実行計画のキャッシュが逆にネックになっているのでは? ストアドの実行時間は、 @適切な実行計画のキャッシュが存在する A実行計画のキャッシュが存在しない B不適切な実行計画のキャッシュが存在する ←速い @<A<<<<<<<<<<B 遅い→ となりBの場合極端にレスポンスが悪化することがあります。 ストアドにリコンパイルオプション(with recompile)をつけて 常にリコンパイルさせると状況は変化しませんか?
一時テーブルへのインサートが遅いのではなく、 一時テーブルへ挿入するためのデータの抽出が遅いのではないですか? [ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2007-06-24 23:02 ] | ||||
|
投稿日時: 2007-06-25 08:54
プロファイラーでそれぞれどんなSQLが実行されているか調査してみてはどうでしょうか?
|