2009-05-16 16 views
1

Wir testen eine Anwendung, die Echtzeitdaten für mehrere Benutzer auf einer Sekunde anzeigen soll. Neue Daten von 128 Zeilen werden jede Sekunde von der Server-Anwendung in eine SQL-Datenbank eingefügt, dann müssen sie von allen Benutzern zusammen mit einer anderen alten 128-fachen Zeile abgefragt werden.Abfragen von Echtzeitdaten aus einer SQL-Datenbank Problem mit plötzlicher Latenz

Wir haben die Abfragezeit getestet und es nicht 30 Millisekunden überschritten; auch die Interface-Funktion, die die Abfrage aufruft, dauerte nicht mehr als 50 Millisekunden mit der Verarbeitung der Daten und alle

Wir entwickelten eine Test-Anwendung, die einen Thread und eine SQL-Verbindung für jeden Benutzer erstellt. Der Benutzer gibt 7 Abfragen alle 1 Sekunde aus. Alles beginnt gut und kein Benutzer benötigt mehr als 300 Millisekunden für die 7 Datenreihen (Abfragen). Nach 10 Minuten überschreitet die Latenz jedoch 1 Sekunde und steigt weiter an. Wir wissen nicht, ob das Problem darin besteht, dass der SQL Server 2008 mehrere Anfragen gleichzeitig bearbeitet und wie man ein solches Problem löst.

Hier ist unser Test-Client, wenn es helfen könnte. Beachten Sie, dass der Client und der Server auf derselben 8-CPU-Maschine mit 8 GB RAM ausgeführt werden. Jetzt stellen wir in Frage, ob die Datenbank nicht die optimale Lösung für uns ist.

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

Woher wissen Sie, dass die Datenbank Sie verlangsamt? – JohnOpincar

+0

Fügt GC zur Latenz hinzu? Jede Abfrage erstellt neue Objekte, die von GC gesammelt werden. –

+0

John, was könnte sonst noch das Problem sein? Shashikant, Wir verwenden GC.keepalive (l), um zu verhindern, dass der Thread beendet wird, wenn der aufrufende Thread abstirbt. – mustafabar

Antwort

0

Ich würde die Abfrage selbst vermuten. Während es bei einer leeren Datenbank möglicherweise nicht viel Zeit benötigt, kann es je nach dem, wie die Suche durchgeführt wird, mehr und mehr Zeit erfordern, da die Datenmenge wächst. Haben Sie den Abfrageplan überprüft, um sicherzustellen, dass Indexsuche statt Tabellensuche durchgeführt wird, um die Daten zu finden? Wenn nicht, würde vielleicht die Einführung einiger Indizes helfen.

1

Warnung: Diese Antwort basiert auf dem Wissen von MSSQL 2000 - nicht sicher, ob es noch korrekt ist.

Wenn Sie viele Einfügungen durchführen, werden die Indizes möglicherweise veraltet und der Server wechselt automatisch zu Tabellenscans, bis die Indizes neu erstellt werden. Ein Teil davon wird automatisch ausgeführt, aber Sie sollten die erneute Indizierung regelmäßig erzwingen, wenn diese Art von Leistung kritisch ist.

+0

Bill, wir haben sogar die Anwendung getestet, während das Einfügen nicht ausgeführt wird. Es zeigte fast die gleiche Verschlechterung der Leistung – mustafabar

Verwandte Themen