Запрос данных в реальном времени из базы данных SQL внезапная проблема с задержкой

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

  •  22-08-2019
  •  | 
  •  

Вопрос

Мы тестируем приложение, которое должно отображать данные в режиме реального времени для нескольких пользователей с интервалом в 1 секунду.Новые данные из 128 строк вставляются серверным приложением каждую секунду в базу данных SQL, затем они должны быть запрошены всеми пользователями вместе с другими старыми ссылочными 128 строками.

Мы протестировали время запроса, и оно не превысило 30 миллисекунд;кроме того, интерфейсной функции, которая вызывает запрос, потребовалось не более 50 миллисекунд на обработку данных и все

Мы разработали тестовое приложение, которое создает поток и SQL-соединение для каждого пользователя.Пользователь выдает 7 запросов каждые 1 секунду.Все начинается нормально, и ни одному пользователю не требуется более 300 миллисекунд для обработки 7 рядов данных (запросов).Однако через 10 минут задержка превышает 1 секунду и продолжает увеличиваться.Мы не знаем, связана ли проблема с тем, что SQL server 2008 обрабатывает несколько запросов одновременно, и как преодолеть такую проблему.

Вот наш клиент для тестирования, если это может помочь.Обратите внимание, что клиент и сервер созданы на одном компьютере с 8 процессорами и 8 ГБ оперативной памяти.Теперь мы задаемся вопросом, не может ли база данных быть для нас оптимальным решением.

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



}
Это было полезно?

Решение

Я бы заподозрил сам запрос.Хотя работа с пустой базой данных может не занять много времени, по мере роста объема данных может потребоваться все больше и больше времени в зависимости от того, как выполняется поиск.Изучили ли вы план запроса, чтобы убедиться, что он выполняет поиск по индексу вместо сканирования таблицы для поиска данных?Если нет, возможно, введение некоторых индексов помогло бы.

Другие советы

Предупреждение:этот ответ основан на знании MSSQL 2000 - не уверен, что он по-прежнему правильный.

Если вы выполняете много вставок, индексы в конечном итоге устареют, и сервер автоматически переключится на сканирование таблиц до тех пор, пока индексы не будут перестроены.Часть этого выполняется автоматически, но вы можете периодически принудительно переиндексировать, если такая производительность критична.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top