2009-05-16 4 views
1

複数のユーザーのリアルタイムデータを1秒単位で表示するアプリケーションをテストしています。 128行の新しいデータがサーバーアプリケーションによってSQLデータベースに1秒ごとに挿入され、次に、すべてのユーザーによって別の古い参照128行とともに照会される必要があります。SQLデータベースからのリアルタイムデータの問い合わせ突然の待ち時間の問題

クエリ時間をテストしましたが、30ミリ秒を超えませんでした。また、クエリを呼び出すインターフェイス関数がデータを処理するのに50ミリ秒以上かかることはありません。

各ユーザーごとにスレッドとSQL接続を作成するテストアプリケーションを開発しました。ユーザーは1秒ごとに7つのクエリを発行します。すべてがうまく始まり、ユーザーは7つのデータシリーズ(クエリ)に対して300ミリ秒以上かかることはありません。ただし、10分後にはレイテンシは1秒を超えて増加し続けます。問題が複数の要求を同時に処理するSQL Server 2008であるかどうか、そのような問題を解決する方法はわかりません。

テストクライアントが役立つ場合は、ここをクリックしてください。クライアントとサーバーは8GBのRAMを備えた同じ8台のCPUマシン上に作成されています。現在、データベースが最適なソリューションではないかどうかを疑問視しています。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Enter Number of threads"); 
     int threads = int.Parse(Console.ReadLine()); 
     ArrayList l = new ArrayList(); 
     for (int i = 0; i < threads; i++) 
     { 
      User u = new User(); 
      Thread th = new Thread(u.Start); 
      th.IsBackground = true; 
      th.Start(); 
      l.Add(u); 
      l.Add(th); 
     } 
     Thread.CurrentThread.Join(); 
     GC.KeepAlive(l); 
    } 
} 
class User 
{ 
    BusinessServer client ; // the data base interface dll 
    public static int usernumber =0 ; 

    static TextWriter log; 
    public User() 
    { 
     client = new BusinessServer(); // creates an SQL connection in the constructor 
     Interlocked.Increment(ref usernumber); 
    } 

    public static void SetLog(int processnumber) 
    { 
     log = TextWriter.Synchronized(new StreamWriter(processnumber + ".txt")); 
    } 
    public void Start() 
    { 
     Dictionary<short, symbolStruct> companiesdic = client.getSymbolData(); 
     short [] symbolids=companiesdic.Keys.ToArray(); 
     Stopwatch sw = new Stopwatch(); 
     while (true) 
     { 

      int current; 
      sw.Start(); 
      current = client.getMaxCurrentBarTime(); 
      for (int j = 0; j < 7; j++) 
      { 
       client.getValueAverage(dataType.mv, symbolids, 
        action.Add, actionType.Buy, 
        calculationType.type1, 
        weightType.freeFloatingShares, null, 10, current, functionBehaviour.difference); // this is the function that has the queries 

      } 
      sw.Stop(); 
      Console.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "\t" + sw.ElapsedMilliseconds); 
      if (sw.ElapsedMilliseconds > 1000) 
      { 
       Console.WriteLine("warning"); 
      } 
      sw.Reset(); 

      long diff = 0;//(1000 - sw.ElapsedMilliseconds); 
      long sleep = diff > 0 ? diff : 1000; 
      Thread.Sleep((int)sleep); 
     } 
    } 



} 
+0

データベースが減速していることをどのように知っていますか? – JohnOpincar

+0

GCがレイテンシに追加されていますか?すべてのクエリは、GCによって収集される新しいオブジェクトを作成しています。 –

+0

John、他に何が問題になる可能性がありますか? Shashikant、GC.keepalive(l)を使用して、呼び出しスレッドが終了したときにスレッドが終了しないようにします。 – mustafabar

答えて

0

質問自体が疑わしいです。空のデータベースでは時間がかかることはありませんが、データ量が増えるにつれてルックアップの仕方によってはますます時間がかかることがあります。クエリプランを調べて、データを検索するためにテーブルスキャンではなくインデックスルックアップを実行していることを確認しましたか?そうでない場合は、おそらくいくつかのインデックスを導入すると役に立ちます。

1

警告:この回答はMSSQL 2000の知識に基づいていますが、それがまだ正しいかどうかは不明です。

多くの挿入を行うと、索引が最終的に古くなり、索引が再作成されるまで自動的に表スキャンに切り替わります。このうちのいくつかは自動的に行われますが、この種のパフォーマンスが重大である場合は、定期的にインデックスを再作成することをお勧めします。

+0

Bill、挿入が実行されていない間もアプリケーションをテストしました。それはほぼ同じ性能低下を示した – mustafabar

関連する問題