- PR -

ADO.Netからのストアド実行処理が極端に遅い

投稿者投稿内容
Dai
会議室デビュー日: 2007/05/24
投稿数: 12
投稿日時: 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 ]
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-05-24 13:50
ボトルネックがドコにあるのかはDaiさんにしか分かりません。
処理時間を正確に計測するには?辺りも含めて時間計測をしてボトルネックが1〜3のどれにあるか調べて下さい。
(ボトルネックが分かったら大体、解決すると思いますが)

1、クライアントプログラム
2、ADOからDBの通信(クライアント・サーバー間通信)
3、DB
Dai
会議室デビュー日: 2007/05/24
投稿数: 12
投稿日時: 2007-05-24 14:23
未記入さん、レスありがとうございます。
ストップウォッチクラスは使用していませんが、
以下の方法でストアド実行時間を取得しています。

コード:
DateTime start = DateTime.Now;

command.ExecuteNonQuery();

DateTime end = DateTime.Now;
Console.WriteLine("所要時間:" + (end - start));



何度か実行し、平均して1時間程度かかります。
しかし、Management Studioから同ストアドを実行すると、
2分程度で処理終了します。
処理結果(INSERT内容)は同じです。

クライアントプログラムはストアド実行部以外に重い処理は無いので、
1、3ではなく、
「2、ADOからDBの通信(クライアント・サーバー間通信)」
がボトルネックであると考えています。

ADO から実行すると、Management Studio からの実行と比較して、
30倍も時間がかかっているのですが、この様な現象は稀にでもあるもの
なのでしょうか??

未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-05-24 14:59
IN(SQL文)が長いとかストアドからのOUTが大きいとかはありますか?

比較調査として、
SQL文が短いストアド、ストアドからのOUTが小さいストアド、あとは〜ストアドの中身が空のストアドを呼び出してみて細かく切り分けてみるしかないですかね。


google先生←この辺はもう見てますよね?
Dai
会議室デビュー日: 2007/05/24
投稿数: 12
投稿日時: 2007-05-24 15:36
レスありがとうございます。

パラメータは31個あります。
ストアドからのOUTは、1行2カラム分のデータ(挿入日付、挿入行数)だけです。

今回問題にしているストアドはINSERT用ですが、
他で使用しているSELECT用ストアドは、Management Studio と
ADO で実行速度に差異はありません。

教えて頂いたURL、まだ見ていないページがありました。
良く読んでみます、ありがとうございます。
ITAROU
会議室デビュー日: 2007/06/24
投稿数: 2
投稿日時: 2007-06-24 16:25
私もこの問題で悩んでおります。
環境はSQLServer2000、VS2003、C#(ASP.NET)です。
クエリーアナライザから実行すると30秒程度で処理が終わるのですが
WEB画面上からADO.NET経由で実行すると3分程度かかってしまいます。
SQLプロファイラで確認したところ一時テーブルへのインサートで
処理が著しく遅延していることがわかりました。(ストアドのリコンパイル
も発生しております)

未記入さんの
「google先生←この辺はもう見てますよね?」
等色々調べたのですがいっこうに解決しません。
どなたか有益な情報がありましたら教えてください。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-06-24 22:37
31個もパラメータのあるストアドということなので、
実行計画のキャッシュが逆にネックになっているのでは?

ストアドの実行時間は、
@適切な実行計画のキャッシュが存在する
A実行計画のキャッシュが存在しない
B不適切な実行計画のキャッシュが存在する
←速い @<A<<<<<<<<<<B 遅い→
となりBの場合極端にレスポンスが悪化することがあります。

ストアドにリコンパイルオプション(with recompile)をつけて
常にリコンパイルさせると状況は変化しませんか?

引用:

ITAROUの書き込みより
SQLプロファイラで確認したところ一時テーブルへのインサートで
処理が著しく遅延していることがわかりました。(ストアドのリコンパイル
も発生しております)


一時テーブルへのインサートが遅いのではなく、
一時テーブルへ挿入するためのデータの抽出が遅いのではないですか?


[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2007-06-24 23:02 ]
めだか
大ベテラン
会議室デビュー日: 2004/11/11
投稿数: 109
投稿日時: 2007-06-25 08:54
プロファイラーでそれぞれどんなSQLが実行されているか調査してみてはどうでしょうか?

スキルアップ/キャリアアップ(JOB@IT)