2011-11-14 10 views
2

従来のアプリケーションのパフォーマンスの問題をトラブルシューティングしていますが、かなり特殊な問題がある可能性があります。実行中の多数の(!)小規模クエリの影響

本質的に、アプリケーションはオブジェクト・リレーショナル・マッパーを使用してデータをフェッチしていますが、非常に非効率的/誤った方法でそうしています。実際には、UIのデータグリッドを埋めるために一連のエンティティグラフのフェッチを実行しており、グリッド(ASP.Net Webforms)をバインドして追加フェッチを行い、他のフェッチなどにつながります。

これは、多数の非常に多くのクエリが実行されているという効果があります。 SQLプロファイラを使用すると、特定のページが10,000回以上のクエリを実行することが示されます(1つのグリッドを埋めるために10ミリ秒以上の時間がかかりません)、プロファイラではほとんどのクエリが0ミリ秒として登録されます。クエリは、(httpリクエストごとの)シングルスレッドとなり

私はORMと非常によく知って、問題を解決する方法を正確に知っている

私の質問は:。。多くを持っていることの正確な効果は何ですか、多くの小さなクエリがアプリケーション内で実行されていますか?システムのさまざまなコンポーネントにどのような影響を及ぼすのですか?

たとえば、WebサーバーのCPUとメモリに与える影響は?接続プールを氾濫させ、ブロックを引き起こしますか?データベースサーバのメモリ、CPU、I/Oに与える影響は?

私は比較的一般的な回答を探しています。主に影響を受ける可能性が高い領域を監視したいからです(私は測定=>修正=>再測定が必要です)。ピーク時にシステムを同時に使用すると、100〜200人程度のユーザーになる可能性があります。

+0

キャッシュの実装を検討しましたか?データが頻繁に変更されない場合は、ビュー/テーブル全体をキャッシュして、すべての個々のクエリを保存することができます。 –

+0

@ Yzmir - ありがとう、しかし、私は実際に問題の解決策を探していません(私はそれを持っています)。 –

答えて

0

これはデータベースによって異なりますが、一般に各クエリには解析フェーズがあります。クエリがバインド変数を使用している場合、おそらくキャッシュされます。もしそうでなければ、あなたはパースのヒットをし、それはしばしばリソースの短いロックを意味します。すなわちBAD。 Oracleでは、CPUとブロッキングは、実行時よりもはるかに優れています。 SQL Serverはそれほどですが、実行時には悪化します。明らかに、ネットワーク上で何かの10Kを実行することはひどい解決策、特に200人のユーザーになるでしょう。ボリューム私は確かに良いですが、その周波数は本当に通信遅延のすべてのオーバーヘッドを強調し、そのようなものです。接続プールは一般的に何万というものではなく、何百ものオブジェクトが作成され、キューに入れられ、管理され、破壊され、ゴミが収集されます。

しかし、深いこの部分のORMを削除し、単一のクエリを実行して結果セットを返すストアドプロシージャを作成します。それをグリッドに置きます。

+0

ORMについてもっと知ることなく、私はそれを避けることを任務に少し大胆であると言いたいと思います。右手の下では、1つのページに対して1つのクエリを実行できるようにすることができます(これは、より多くの層にわたってロジックを広げたくない場合は十分です)。 – spender

+0

ええ、私は明確にしましょう。 ORM [このページ/ページの一部]のORMを削除して、結果を返す単一のクエリを作成することもできない場合は除外します。 – LoztInSpace

+0

ORMはそれとは関係がありません。間違った手で正しいツールを使用した場合です。 –