※ ChatGPTを利用し、要約された質問です(原文:SQLServerの同時接続)
SQLServerの同時接続による処理速度の低下について
このQ&Aのポイント
SQLServer2000で複数ユーザーが同時に実行すると、SELECTの結果を返すストアドプロシージャの処理速度が低下する現象が発生しています。
SELECT文が複雑で対象データの件数も多いため、並列実行できないサブクエリ単位の情報取得がお互いを妨げる状態になっている可能性があります。
SELECT時の共有ロックでは更新ロックではないため、複数ユーザーの同時実行には影響しないという認識は正しいです。
質問させていただきます。
SQLSerever2000でSELECTの結果を返すだけのストアドプロシージャがあるのですが、複数のユーザーが同時に実行すると、単独で実行した場合に比べて処理速度が低下するという現象が起こっています。
このSELECT(のみ)同士で処理が遅くなることについて原因がわからずに困っています。
今わかっていることは
(1)SQL文が非常に複雑(サブクエリの結合も多い)で対象データの件数も多い。
(2)実行時はUPDATEなどの更新処理は一切入っていない(トランザクションも張っていない)。
(3)SELECT時にWITH(NOLOCK)を使用しても結果は変わらない。
(4)分離レベルをUNCOMMITEDにしてみたが結果は変わらない。
(5)プロファイラ上で実行時デッドロックが発生していないことは確認済み
(6)ほぼ同時に実行するとやたら遅く、少しタイミングをずらして実行すると、あまり影響し合わない。
(7)処理速度の遅延は同時実行ユーザーのお互いについて発生する(※片方だけが待つわけではなく、ほぼ同時に開始した処理は単独の場合と比べて長い時間をかけて同時に終了する)
以上の事から、ストアドプロシージャの実行処理そのものは並列処理となっているが、SELECT内でのサブクエリ単位の情報取得→結果を返す・・・の処理まわりは並列実行できず、サブクエリごとにお互いを邪魔しあうような状態が発生しているように見えます。
このような想定はそもそも見当違いなのでしょうか?
実際にSELECTのみのSQL同士を複数ユーザーで実行するだけでお互いの処理に影響しあうようなことはあるのでしょうか?
また、SELECT時の『共有ロック』について複数ユーザーの同時実行には何の影響もない(更新ロックではないので、ロックの取得は可能)の認識ですが、認識誤りはないでしょうか?
DBにはあまり詳しくないのでおかしな事を質問しているかもしれませんが、宜しくお願いいたします。
お礼
ご回答ありがとうございます。 その後の調査で同時実行時のスレッド数の枯渇が原因ではないかという結論に達し、自己解決いたしました。