1

WebサーバーとSQLServer2008データベースが同じサーバーファーム内の異なるボックスに配置されているWebアプリケーションがあります。

モノリシックストアドプロシージャをいくつかの小さなストアドプロシージャに分割して、クライアントコードが1つではなく複数のストアドプロシージャの呼び出しを担当するようにすると、Webアプリケーションのパフォーマンスが大幅に低下することに気付くでしょうか。


追加の背景情報:

決定ロジック、更新ステートメント、そして最後にデータのセットをクライアントに返すselectステートメントを含む数百行のコードを含むストアドプロシージャがあります。

コンポーネントDLLを呼び出すクライアントコード(この意味では、クライアントコードはデータベースサーバーを呼び出しているASP Webサーバー)に機能の一部を挿入する必要があります。ただし、ストアドプロシージャはレコードセットを更新し、同じ呼び出しで更新されたデータを返します。理想的には、決定ロジックと更新ステートメントが呼び出された、データがクライアントに返される前に、コードを呼び出す必要があります。

この機能を機能させるには、既存のストアドプロシージャを少なくとも2つの部分に分割する必要があります。1つはデータベースを更新するストアドプロシージャで、もう1つはデータベースからデータを取得します。次に、これらのストアドプロシージャ呼び出しの間に新しいコードを挿入します。

この問題を見ると、コードメンテナンスの観点から、すべての更新と選択ステートメントをシンストアドプロシージャに分離し、ビジネスロジックをクライアントに任せる方がはるかに良いと思わざるを得ません。コード。そうすれば、クライアントコードに機能や決定ロジックを挿入する必要があるときはいつでも、巨大なストアドプロシージャを変更するのではなく、クライアントコードを変更するだけで済みます。

コードの保守の観点からは、シンストアドプロシージャを使用する方が良いかもしれませんが、データベースへのトリップ数を増やすと、パフォーマンスがどの程度低下しますか?データへの最終的な結果は同じですが、私はデータベースに頻繁にアクセスしています。アプリケーションをスケールアップして需要を処理する場合、このアプローチはパフォーマンスにどのように影響しますか?

私は、特にコードのメンテナンスに影響を与える場合に、パフォーマンスの最適化を何よりも優先するわけではありませんが、Webアプリケーションを拡張する必要があるときに、足を踏み入れて頭痛の種を作りたくありません。

4

4 に答える 4

1

本質的に、この質問は密結合と緩結合に密接に関連しています。

最初に:いつでもモノリシックストアドプロシージャを取得して、いくつかの小さなストアドプロシージャに分割できます。これらはすべて、1つのストアドプロシージャによって呼び出されるため、クライアントコードは1つのストアドプロシージャの呼び出しのみを担当します。

クライアントが何かをする(データを変更するか、ユーザーにステータスを提供する)場合を除いて、クライアントに複数の呼び出しを移動することはおそらくお勧めしません。これは、クライアントをストアドプロシージャの操作の順序に緊密に結合するため、パフォーマンスが大幅に低下するためです。増加。

いずれにせよ、私はそれをベンチマークし、そこから調整します。

于 2010-07-15T14:20:53.800 に答える
1

一般に、経験則として、少なくともSQLサーバーへのラウンドトリップを行う必要があります。

サーバーでの「ヒット」は非常にコストがかかります。実際には、同じ操作を3つの部分に分割してから、サーバーで1ヒットとその他すべてを実行する方がコストがかかります。

メンテナンスに関しては、クライアントから1つのストアドプロシージャを呼び出し、そのプロシージャに別の2つのプロシージャを呼び出させることができます。

私は極端な検索ロジックを備えたアプリケーションを持っていました。それを実装するために私がしたことです。

いくつかのベンチマーク結果...しばらく前にサーバーがダウンして崩壊しているクライアントがありました。問題を確認したところ、SQLサーバーへのラウンドトリップが多く、最小化するとサーバーは通常の状態に戻りました。

于 2010-07-15T14:21:50.857 に答える
1

影響します。すべてのビジネスロジックがDB/2データベースに接続されたAppServerにあるWeblogicサーバーを使用します。プロジェクトでは主にエンティティBeanを使用しており、ほとんどのビジネスサービスの呼び出しでは、目に見える副作用なしにDBに何度かアクセスします。(必要に応じて、いくつかのクエリをマルチテーブルに調整します)。

それは本当にあなたのアプリに依存します。ベンチマークを行う必要があります。

于 2010-07-15T14:18:12.723 に答える
1

適切なハードウェア上で適切にセットアップされたSQLServerは、1秒あたり数千のトランザクションを処理できます。

実際、大規模なストアドプロシージャを分割すると、バッチごとに1つのキャッシュクエリプランしか持てないため、有益な場合があります。複数のバッチに分割するということは、それぞれが独自のクエリプランを取得することを意味します。

あなたは間違いなくコード保守の側で誤りを犯すべきですが、確かにベンチマークです。

クエリプランランドスケープが変化することを考えると、インデックスを更新する準備をしておく必要があります。おそらく、さまざまなカバーインデックスを作成する必要があります。

于 2010-07-15T14:18:13.663 に答える