これが問題の概要です:ローカルで実行した場合とリモートで実行した場合のストアドプロシージャの実行速度が上がるのはなぜですか?
まだ結論にジャンプしないでください、私が何を意味するのか説明しましょう...
これが設定です:
Windows 2008R2(修正:2003)アプリケーションサーバーは、いくつかのアクションを実行するストアドプロシージャを実行します(この時点での動作は本当に重要です)。このストアドプロシージャは、データベースサーバーへのTCP/IP接続を介してSQLサーバーで実行されます。 DBサーバーは物理的にはアプリケーションサーバーのすぐ隣にあり、1 GB NICを介して1 GBスイッチに相互に接続されています。 DBサーバーはSQL 2005 SP2 Enterprise Editionを実行しており、16 GBのメモリと、HP-EVA FC接続のSANの48個の15kドライブにストライプ化された複数のvLUNSを備えています。これまでのすべてのインジケーターから、I/O、Mem、またはCPUの制約や制限に達していることはありません。 Trace Falg 1118はオンで、TempDBは独自のvLUN上の8つのファイルに分割されています。データとTLogにも独自のvLUNSがあります。
つまり、ここに私が見ているものがあります:
データベースサーバーでSQLCMDを使用して、同じDBサーバーからSQLProfilerを実行すると、ストアドプロシージャを実行でき、実行がすぐに開始され、約30秒の時間で完了します。 IO約1200で2,100ms。
アプリケーションサーバーでSQLCMDを使用して、SQLProfilerをDBサーバーから実行すると、同じ正確なストアドプロシージャを同じ正確なパラメーターで実行でき、実行がすぐに開始され、 IO約1200で、約110,000msの持続時間。
クエリの結果は1行、4列です[INT、INT、VARCHAR(50)、VARCHAR(100)]
ASIDE :(私はクエリが列車事故であることを知っています、これは規制されたシステムであり、ライブのProdutionサーバーで変更することはできないので、そうすることについて何も提案しないでください。次のバージョンより良いものに書き直されました。)
目に見えるすべてのものから、このような違いが見られるはずがある理由はありませんが、アプリケーションサーバーからこのクエリを呼び出す.NETアプリケーションが応答を待っている間にタイムアウトしているのが問題です。
ロックとブロック、WAIT状態、クエリプラン、IO競合、CPU競合、MEM競合、ネットワークの飽和/使用率、すべてのインデックスでのインデックスの再構築の実行、すべての統計の更新、およびハンドを確認しました。他のアイテムでいっぱいですが、なぜこれが起こっているのかを指摘するものは何もありません。
ご不明な点がございましたら、さらに質問してください。問題が発生したら推奨してください。影響に応じて(これは運用環境であることを忘れないでください)、それらを試して返信します。
-ありがとう! -クリス
これはネットワークの問題ではありません(魅力的ですが)。
これはほぼ間違いなく「ノイズ」です。ここで私が意味するのは、この操作を、おそらく2時間程度(またはそれ以上)にわたって、dbサーバー自体とアプリサーバーから100回実行する必要があるということです。
私があなたが見つけることを強く期待するのは、特定の時間にどちらか/両方のシステムで高速に実行され、特定の時間にどこで開始されても遅いことです。
例えば。 SQLワークロードは、ネットワークではなく、実際に測定しているものです。
接続の問題または計画の問題のように聞こえます:
両方をSSMSから実行する場合は、[クエリ]メニューの[クライアント統計を含める]オプションを使用して、一番下の行の[サーバー応答の待機時間]を比較して検証できます。また、ネットワークのチャタリングの量をさらに詳しく知ることができます。