Frage

Wir testen eine Anwendung, die für mehrere Benutzer Daten in Echtzeit angezeigt werden auf einer 1 Sekunde Grundlage soll. Neue Daten von 128 Zeilen ist jeweils eine zweite von der Server-Anwendung in eine SQL datatbase eingefügt dann hat es von allen Benutzern zusammen mit einer anderen alten referentiellen 128 Zeilen abgefragt werden.

Wir testeten die Abfragezeit und es lag nicht über 30 milliseonds; auch die Schnittstellenfunktion, die die Abfrage ruft dauerte nicht mehr als 50 Millisekunden mit der Datenverarbeitung und alle

Wir haben eine Testanwendung, die einen Thread und eine SQL-Verbindung für jeden Benutzer erstellt. Der Benutzer gibt 7 Abfragen jeweils 1 Sekunde. Alles beginnt in Ordnung, und kein Benutzer braucht mehr als 300 Millisekunden für die 7 Datenreihe (Abfragen). Jedoch nach 10 Minuten, übersteigt die Latenz 1 Sekunde und hält auf die Erhöhung. Wir wissen nicht, ob das Problem von dem SQL-Server 2008 Handhabung mehrere Anfragen zur gleichen Zeit ist und wie ein solches Problem zu überwinden.

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

   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);
        }
    }



}
War es hilfreich?

Lösung

Ich würde vermuten, dass die Abfrage selbst. Es ist zwar nicht viel Zeit auf einer leere Datenbank in Anspruch nehmen, da die Datenmenge wächst kann es mehr und mehr Zeit in Anspruch nehmen, je nachdem, wie der Blick nach oben erfolgt. Haben Sie untersuchten den Abfrage-Plan, um sicherzustellen, dass es Index-Lookups anstelle von Tabellen-Scans, die Daten zu finden tut? Wenn nicht, vielleicht die Einführung einiger Indizes helfen würden.

Andere Tipps

. Achtung: diese Antwort basiert auf der Kenntnis von MSSQL 2000 - nicht sicher, ob es noch stimmt

Wenn Sie eine Menge von Einsätzen tun, werden die Indizes schließlich veraltet erhalten und der Server schaltet automatisch auf Tabellen-Scans, bis der Indizes neu erstellt werden. Ein Teil davon wird automatisch durchgeführt, aber Sie können reindexing periodisch erzwingen wollen, wenn diese Art von Leistung entscheidend ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top