C # + SQL Server - самый быстрый / эффективный способ чтения новых строк в память - PullRequest
2 голосов
/ 21 января 2011

У меня есть база данных SQL Server 2008, и я использую C # 4.0 с настройкой классов Linq to Entities для взаимодействия с базой данных.

Существует таблица, которая индексируется в столбце DateTime, где значением является время вставки строки. Несколько новых строк добавляются в секунду (~ 20), и мне нужно эффективно вытянуть их в память, чтобы я мог отобразить их в графическом интерфейсе. Для простоты давайте просто скажем, что мне нужно показать 50 последних строк в списке, отображаемом через WPF.

Я обеспокоен тем, что опрос нагрузки может повлиять на базу данных, и время, которое потребуется для обработки новых результатов, вынуждает меня стать медленным потребителем (застревание за отставанием). Я надеялся на несколько советов по подходу. Те, которые я рассматриваю, являются:

  1. Опрос базы данных в тесном цикле (~ 1 результат на запрос)
  2. Опрашивать базу данных каждую секунду (~ 20 результатов на запрос)
  3. Создать триггер базы данных для вставок и связать его с событием в C # ( SqlDependency )

У меня также есть несколько вариантов доступа;

  1. Выбор таблицы Linq-to-Entities
  2. Необработанный SQL-запрос
  3. Хранимая процедура Linq-to-Entities

Если бы вы могли пролить свет на плюсы и минусы или предложить какой-то другой способ, я бы с удовольствием его услышал.

Процесс, который добавляет строки в таблицу, не находится под моим контролем, я хочу только прочитать строки, которые никогда не нужно изменять или добавлять. Самые важные вещи - не перегружать SQL Server, поддерживать графический интерфейс в актуальном состоянии, быстро реагировать и использовать как можно меньше памяти ... вы знаете, основы;)

Спасибо!

Ответы [ 4 ]

0 голосов
/ 08 марта 2011

Я немного опоздал на вечеринку, но если у вас есть функция в вашей редакции SQL Server 2008, есть функция, известная как Изменить сбор данных , которая может помочь.По сути, вы должны включить эту функцию как для базы данных, так и для конкретных таблиц, которые вам нужно захватить.Встроенный процесс захвата данных изменений просматривает журнал транзакций, чтобы определить, какие изменения были внесены в таблицу, и записывает их в предопределенную структуру таблицы.Затем вы можете запросить эту таблицу или получить результаты из таблицы во что-то более дружелюбное (возможно, на другом сервере вообще?).Мы находимся на ранних стадиях использования этой функции для конкретных бизнес-требований, и до сих пор она работает достаточно хорошо.

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

0 голосов
/ 21 января 2011

Если ваша таблица постоянно обновляется со скоростью 20 строк в секунду, то нет ничего лучше, чем тянуть каждую секунду или каждые несколько секунд.Пока у вас есть эффективный способ (имеется в виду индекс или кластерный индекс), который может извлечь последние вставленные строки, этот метод будет потреблять наименьшее количество ресурсов.

ЕСЛИ обновления происходят в пакете из 20 обновлений вво-вторых, но со значительными периодами бездействия (минуты) между ними, вы можете использовать SqlDependency (который, между прочим, не имеет абсолютно никакого отношения к триггерам, читает Таинственное уведомление , чтобы узнать, как оно на самом деле работает),Вы можете смешивать LINQ с SqlDependency, см. linq2cache .

0 голосов
/ 21 января 2011

У вас есть , чтобы запросить уведомление о новых данных?

Возможно, вам лучше использовать push-уведомления из служебной шины (например: NServiceBus ).

Использование уведомлений (т.е. событий) почти всегда является лучшим решением, чем опрос.

0 голосов
/ 21 января 2011

Вместо того, чтобы опрашивать базу данных, возможно, вы можете использовать посредник SQL Server Service и выполнять чтение оттуда, даже нажимая, какие строки являются новыми.Затем вы можете выбрать из таблицы.

Самая важная вещь, которую я бы здесь увидел, - это наличие индекса для определения новых строк (отметка времени?).Таким образом, ваш запрос будет выбирать верхние записи из индекса вместо того, чтобы каждый раз запрашивать таблицу.

Test, test, test!Оцените свою производительность для любой тактики, которую вы хотите попробовать.Самые большие проблемы, которые необходимо решить, это то, как хранятся данные, и любые проблемы с блокировками и согласованностью, с которыми вам нужно иметь дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...