Interrogation des données en temps réel à partir d'un problème de latence soudaine de base de données SQL

StackOverflow https://stackoverflow.com/questions/872400

  •  22-08-2019
  •  | 
  •  

Question

Nous testons une application qui est censé afficher les données en temps réel pour plusieurs utilisateurs sur 1 seconde base. De nouvelles données de 128 lignes est insérée à chaque une seconde par l'application serveur dans un datatbase SQL, alors il doit être interrogé par tous les utilisateurs avec un autre vieux référentiel 128 lignes.

Nous avons testé le temps de requête et il ne dépasse pas 30 milliseonds; également la fonction d'interface qui invoque la requête n'a pas plus de 50 millisecondes avec le traitement des données et tout

Nous avons développé une application de test qui crée un fil et une connexion SQL par chaque utilisateur. Les questions utilisateur 7 requêtes chaque 1 seconde. Tout commence bien, et aucun utilisateur prend plus de 300 millisecondes pour la série de données 7 (requêtes). Cependant, au bout de 10 minutes, le temps d'attente dépasse 1 seconde et ne cesse d'augmenter. Nous ne savons pas si le problème provient du serveur SQL 2008 traiter plusieurs demandes en même temps, et la façon de surmonter ce problème.

Voici notre client de test si elle peut aider. Notez que le client et le serveur sont faites sur la même machine 8 CPU avec 8 Go de RAM. Maintenant, nous demandons si la base de données pourrait ne pas être la solution optimale pour nous.

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



}
Était-ce utile?

La solution

Je soupçonne la requête elle-même. Bien qu'il ne peut pas prendre beaucoup de temps sur une base de données vide, comme la quantité de données augmente, il peut exiger de plus en plus de temps en fonction de la façon dont la mise en regard est fait. Avez-vous examiné le plan de requête pour vous assurer qu'il est en train de faire au lieu de recherches d'index des analyses de table pour trouver les données? Dans le cas contraire, l'introduction peut-être quelques indices contribueraient.

Autres conseils

Attention:. Cette réponse est basée sur la connaissance de MSSQL 2000 - pas sûr si elle est encore correcte

Si vous faites beaucoup d'inserts, les indices finiront par sortir de la date et le serveur bascule automatiquement sur les analyses de table jusqu'à ce que les index sont reconstruits. Une partie de cela est fait automatiquement, mais vous pouvez forcer la réindexation périodiquement si ce genre de performance est critique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top