私のチームは私に「それは問題ではない」と言っていて、それは私をイライラさせているので、私はあなたのプロ/達人からの確認/説明が必要です:)
背景:メインの MVC3 / .Net4 Web アプリで使用されている SQL Server 2008 があります。任意の時点で約 200 人以上の同時ユーザーがいます。サーバーは非常に大きな打撃を受けており (ロック、タイムアウト、全体的な速度低下)、キャリアを通じて、また最後の MS 認定クラスで学んだことを適用しようとしています。これらは私たち全員が掘り下げてきたものであり (「SQL 接続を閉じる STAT」)、これらの「ささいなこと」は 1 つだけで違いが生じるわけではなく、最終的には合計されることをチームに説明しようとしています。
以下がパフォーマンスに影響を与えるのか、それとも単に「ベストプラクティス」なのかを知る必要があります
1.「USING」キーワードの使用。 彼らのコードのほとんどは次のようなものです:
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
USING がリソースをより速くクローズ/解放することを彼らに伝えようとしている間:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
彼らの主張は、コードの実行が完了した後、GC は適切なクリーンアップを行うため、USING は大きな影響を与えないというものです。真か偽か、その理由は?
2. 接続プール
接続プールを設定すると、Web サイト (少なくとも .Net w/MSSQL) を大幅に高速化できるといつも聞いていました。web.config の接続文字列に以下を追加することをお勧めします。
..."プーリング=True;最小プール サイズ=3;最大プール サイズ=100;接続タイムアウト=10;"...
彼らの主張は、.Net/MSSQL はすでに舞台裏で接続プールをセットアップしており、web.config に入れる必要はないというものです。正しいか間違っているか?プーリングが既にセットアップされている場合、最適なパフォーマンスのためにプーリングを追加する必要があると他のすべてのサイトが言うのはなぜですか?
3. DB の呼び出し回数を最小限に抑える
デフォルトの .Net MVC プロジェクトに付属している Role/Membership プロバイダーは便利です。便利で、ほとんどの作業を自動的に行ってくれます。しかし、これらの人は真剣に使用しUsersInRoles()
ており、グローバル変数のように自由に使用しています (このメソッドが呼び出されるたびに DB にヒットします)。すべてのページロードで事前にすべてのロールをロードする「ユーザーオブジェクト」を作成し(GUIDなどの他のユーザーのものと一緒に)、ユーザーがロールを持っているかどうかをこのオブジェクトに照会します。
Web サイトの他の部分には、200 回以上ループし、パスごとに 20 ~ 30 回の SQL クエリを実行する FOR ステートメントがあります = 4,000 回を超えるデータベース呼び出し。何とか数秒でこれを行いますが、私がやりたいのは、20-30 の DB 呼び出しを 1 つに統合して、1 つの呼び出しを 200 回 (各ループ) 行うことです。しかし、SQL プロファイラーはクエリに「0 秒」かかったと言っているため、サーバーがこれらの多数の DB クエリを処理できるほど高速で小さいという議論があります。
私の考えでは、「ええ、これらのクエリは高速に実行されていますが、SQL サーバー全体のパフォーマンスが低下しています。」これが要因になるのでしょうか?私は何も心配していませんか、それともサーバー全体のパフォーマンスの問題に (重大な) 影響を与えている要因なのでしょうか?
4. その他のコードの最適化
最初に頭に浮かぶのはStringBuilder
、単純な文字列変数 vs の使用です。なぜStringBuilder
(特にループで)使用する必要があるのか は理解していますが、彼らはそれは問題ではないと言っています.10k以上の行を書く必要があるとしても、彼らの主張はパフォーマンスの向上は問題ではないということです.
全体として、私たちが学び、掘り下げてきたすべてのこと (「スコープを最小化します!」) は、実際のパフォーマンスの向上を伴わない「ベスト プラクティス」にすぎないのでしょうか? それとも、すべてが実際の/測定可能なパフォーマンスの低下に寄与しているのでしょうか?
編集*** すべての回答に感謝します!あなたの回答に基づいて、新しい (5 番目の) 質問があります。実際、彼らは「USING」を使用していません。接続プーリングが自動的に行われている場合、GC が発生するまでプールからの接続が拘束されますか? SQL サーバーへの接続を開くたびに、サーバーに少し負担がかかり、速度が低下する可能性はありますか?
あなたの提案に基づいて、a) サーバーが遅い、b) サーバーが接続を閉じていない、c) プロファイラーが 0 秒で実行されたと言っている、遅い接続から来ている可能性があります。
皆さんの助けに本当に感謝しています。再度、感謝します