Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从SQL数据库查询实时数据突然出现延迟问题_Sql Server_Database_Real Time - Fatal编程技术网

Sql server 从SQL数据库查询实时数据突然出现延迟问题

Sql server 从SQL数据库查询实时数据突然出现延迟问题,sql-server,database,real-time,Sql Server,Database,Real Time,我们正在测试一个应用程序,它应该在1秒的基础上为多个用户显示实时数据。服务器应用程序每秒将128行的新数据插入SQL Database,然后所有用户都必须查询该数据以及另一个旧的引用128行 我们测试了查询时间,它不超过30百万秒;另外,调用查询的接口函数处理数据和所有数据所用的时间也不超过50毫秒 我们开发了一个测试应用程序,为每个用户创建一个线程和一个SQL连接。用户每1秒发出7个查询。开始时一切正常,7个数据系列(查询)的用户时间不会超过300毫秒。但是,10分钟后,延迟超过1秒,并且持续

我们正在测试一个应用程序,它应该在1秒的基础上为多个用户显示实时数据。服务器应用程序每秒将128行的新数据插入SQL Database,然后所有用户都必须查询该数据以及另一个旧的引用128行

我们测试了查询时间,它不超过30百万秒;另外,调用查询的接口函数处理数据和所有数据所用的时间也不超过50毫秒

我们开发了一个测试应用程序,为每个用户创建一个线程和一个SQL连接。用户每1秒发出7个查询。开始时一切正常,7个数据系列(查询)的用户时间不会超过300毫秒。但是,10分钟后,延迟超过1秒,并且持续增加。我们不知道问题是否来自于SQLServer2008同时处理多个请求,以及如何克服这样的问题

这是我们的测试客户机,如果它可能有所帮助的话。请注意,客户机和服务器位于具有8GB RAM的同一台8CPU机器上。现在,我们质疑数据库是否不是我们的最佳解决方案

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



}
类程序
{
静态void Main(字符串[]参数)
{   
Console.WriteLine(“输入线程数”);
int threads=int.Parse(Console.ReadLine());
ArrayList l=新的ArrayList();
对于(int i=0;i1000)
{
控制台。写线(“警告”);
}
sw.Reset();
长差=0;/(1000-sw.ElapsedMilliseconds);
长睡眠=diff>0?diff:1000;
Thread.Sleep((int)Sleep);
}
}
}

我会怀疑查询本身。虽然在空数据库上可能不会花费太多时间,但随着数据量的增加,可能需要越来越多的时间,具体取决于查找的方式。您是否检查了查询计划以确保它正在进行索引查找而不是表扫描以查找数据?如果没有,也许引入一些索引会有所帮助。

我会怀疑查询本身。虽然在空数据库上可能不会花费太多时间,但随着数据量的增加,可能需要越来越多的时间,具体取决于查找的方式。您是否检查了查询计划以确保它正在进行索引查找而不是表扫描以查找数据?如果没有,也许引入一些索引会有所帮助。

警告:此答案基于MSSQL 2000的知识-不确定是否仍然正确


如果进行大量插入,索引最终将过时,服务器将自动切换到表扫描,直到重建索引。其中一些操作是自动完成的,但是如果这种性能非常关键,您可能希望定期强制重新编制索引

警告:此答案基于MSSQL 2000的知识-不确定是否仍然正确


如果进行大量插入,索引最终将过时,服务器将自动切换到表扫描,直到重建索引。其中一些操作是自动完成的,但是如果这种性能非常关键,您可能希望定期强制重新编制索引

你怎么知道是数据库在拖你的后腿?GC会增加延迟吗?每个查询都在创建新的对象,这些对象将由GC收集。John,还有什么问题?Shashikant,我们使用GC.keepalive(l)来防止调用线程死亡时线程被终止。你怎么知道是数据库在拖你的后腿?GC会增加延迟吗?每个查询都在创建新的对象,这些对象将由GC收集。John,还有什么问题?Shashikant,我们使用GC.keepalive(l)来防止调用线程死亡时线程终止。Bill,我们甚至在没有执行插入时测试了应用程序。它表现出几乎相同的性能下降,我们甚至在不执行插入的情况下测试了应用程序。它表现出几乎相同的性能退化