1

この質問は、以前に尋ねられた質問のフォローアップです。

このような簡単なプログラムを作成しました。

string s;
do
{
  using (SqlConnection conn = new SqlConnection("POOLEDCONN"))
  {
    using (SqlCommand cmd = new SqlCommand("", conn))
    {
        s = (string) cmd.ExecuteScalar();
        Code2IncrementPerfomanceCounter
    }
  }    
} while (!string.IsNullOrEmpty(s))

クエリは文字列(nvarchar(max)、現在の最大サイズ9k)を返しますが、SQLServerと.NETの間には多くの遅延があります。SQLプロファイラーはクエリの期間が0ミリ秒であると言っているので、データベースではないと思います。ネットワークは1ミリ秒未満で応答しているため、ネットワークであってはなりません。

このコードをテストサーバー(VMWare、SQLは仮想化されていません)で実行すると、1秒あたり最大600ループになります。アプリケーションは5%を超えるCPUを消費しません。なぜ速くならないのですか?SQLなどからデータを取得するためにストリーミングを使用する必要がありますか?

よろしくお願いします

4

3 に答える 3

1

1秒あたり600コールは、1.7ミリ秒あたり1コールです。遅延が1ミリ秒で、SQL Serverがそれに少し追加する場合、それはもっともらしい結果のように思われますか?

于 2009-08-17T10:32:25.240 に答える
0

私はあなたが見る必要がある3つの異なるものを持っています:

  1. WebサーバーがTCP/IPを使用してDBサーバーに接続していますか、それとも別のプロトコルを使用していますか?
  2. dtoNetプロセスを実行しているマシンのネットワークはどのくらいビジーですか?
  3. SQL呼び出しを削除し、パフォーマンスカウンターのログのみを残すと、パフォーマンスは600プロセス/秒を超えますか?
于 2009-08-17T14:49:24.510 に答える
0

SQL接続の開閉にはコストがかかります。代わりに一度だけそれを行うことができますか?

于 2009-08-17T15:00:18.190 に答える