SQL Serverへのトリップ数を増やすことで、どのくらいのパフォーマンスを失いますか?
-
16-09-2020 - |
質問
私は、WebサーバーとSQL Server 2008データベースが同じサーバーファーム内の別のボックスに座るWebアプリケーションを持っています。
モノリシックストアドプロシージャを受信し、それをいくつかの小さなストアドプロシージャに分割して、1つだけではなく複数のストアドプロシージャへの呼び出しを担当するクライアントコードを担当します。私のWebアプリケーション?
追加の背景情報:
決定ロジック、更新文を含む数百行のコード、最後にクライアントにデータのセットを返すSELECT文を持つストアドプロシージャが格納されています。
私のクライアントコードに機能を挿入する必要があります(この意味で、クライアントコードはデータベースサーバを呼び出しているASP Webサーバである)コンポーネントDLLを呼び出す必要があります。ただし、ストアドプロシージャはレコードセットを更新し、同じコールにUDPatedデータを返すことであり、理想的にはの後にと呼ぶ必要があります。 / EM>データはクライアントに返されます。
この機能を機能させるには、おそらく既存のストアドプロシージャを少なくとも2つの部分に分割する必要があります.1つのストアドプロシージャとデータベースからデータを取得する別のストアドプロシージャ。その後、これらのストアドプロシージャー間で新しいコードを挿入します。
この問題を見ても、コードメンテナンスの観点からは、 all を省略することがはるかに優れていると思います。ストアドプロセッサとビジネスロジックをクライアントコードに残します。そのように、私がクライアントコードに機能性または決定ロジックを挿入する必要があるときはいつでも、私がする必要があるのは、巨大なストレージProcを変更する代わりにクライアントコードを変更することです。
薄いストアドプロシージャを使用すると、コードメンテナンスポイントビューからより良いかもしれませんが、データベースへの旅行数を増やすことでどれだけの性能の苦痛が発生するのでしょうか。データへの正味の結果は同じですが、私はデータベースにもっと頻繁に触れています。このアプローチは、アプリケーションが需要を処理するためにスケーリングされたときにパフォーマンスにどのように影響しますか?
特にコードのメンテナンスに影響を与える場合は、他のすべてのものより上にパフォーマンスの最適化を配置するのではありませんが、Webアプリケーションの縮尺がある場合は頭を撮影して頭痛を作成したくない。
解決
一般的に、経験則として、最小限のSQL Serverにroundtripsを作成する必要があります。
サーバ上の「ヒット」は非常に高価であり、実際には3つの部分に同じ操作を3つの部分に割り当てることがより高価です。
メンテナンスに関しては、そのプロシージャが別の2 PROC'Sを呼び出すクライアントから1つのストアドプロシージャを呼び出すことができます。
私は極端な検索ロジックを持つアプリケーションを持っていました、それは私がそれを実装するためにしたことです。
いくつかのベンチマーク結果... SQL Serverへの多くの往復であったとき、私たちが最小化されたときに、サーバーが正常に戻ったときに、サーバーが残っていたときにクライアントAがありました。
他のヒント
それは影響を与えます。WebLogic Serverは、すべてのビジネスロジックがDB / 2データベースに接続されているAppServerにあるWebLogic Serverを使用します。私達は私達のプロジェクトで主にエンティティBeanを使用し、そしてほとんどのビジネスサービスの呼び出しは、目に見える副作用なしでdbにいくつかの旅行をします。(必要なときにマルチテーブルになるクエリを一部調整します)。
それは本当にあなたのアプリによって異なります。あなたはベンチマークする必要があります。
良いハードウェア上のウェルセットアップSQL Serverは、毎秒何千ものトランザクションを処理できます。
実際には、バッチごとに1つのキャッシュされたクエリプランしか持つことができないため、大きなストアドプロシージャを分割することができます。いくつかのバッチに分割すると、それぞれが自分のクエリプランを取得することを意味します。
コードメンテナンスの横に間違いなく誤っている必要がありますが、ベンチマークを確認してください。
クエリプランの風景がChnageであることを考えると、おそらくあなたのインデックスを更新する準備をしてください、おそらくさまざまなカバーインデックスを作成する必要があります。
本質的に、この質問はゆったりと緩いカップリングと密接に関係しています。
常にモノリシックストアドプロシージャを取得し、複数の小さなストレージPROC、がすべて1つのストアドプロシージャで呼び出されることができます。したがって、クライアントコードは呼び出しを担当するだけです1つのストアドプロシージャ
クライアントが何かをする(データを変更するか、ユーザーにステータスを提供する)限り、クライアントをストアドプロシージャの操作の順序に厳密に結合することをお勧めします。著しい性能が高くなります。
どちらかの方法で、私はそれをベンチマークしてそこから調整します。