Наше серверное приложение получает информацию о строках для добавления в базу данных со скоростью 1000-2000 строк в секунду в течение всего дня. В таблице есть два взаимоисключающих столбца, которые однозначно идентифицируют строку: один представляет собой числовой идентификатор с именем «тег», а другой - строку из 50 символов, называемую «longTag». Строка может иметь тег или longTag; не оба.
Каждая строка, которая выходит из сокета, может или не может уже существовать в таблице. Если он существует, эта строка должна быть обновлена с новой информацией. Если он не существует, он должен быть добавлен. Мы используем SQL 2005, а в некоторых случаях даже SQL 2000, поэтому мы не можем использовать новое ключевое слово MERGE.
То, как я делаю это сейчас, заключается в создании гигантского оператора DELETE, который выглядит следующим образом:
DELETE from MyRecords
WHERE tag = 1
OR tag = 2
OR longTag = 'LongTag1'
OR tag = 555
... где каждая входящая строка имеет свое собственное предложение «ИЛИ тег = n» или «ИЛИ longTag =« x »».
Затем я выполняю массовую загрузку XML, используя ISQLXMLBulkLoad, чтобы загрузить все новые записи одновременно.
Гигантский оператор DELETE иногда прерывается, занимая 30 секунд или дольше. Я не уверен почему.
Когда записи поступают из сокета, они должны быть либо вставлены, либо заменить существующие строки. Является ли способ, которым я делаю это, лучший способ сделать это?
РЕДАКТИРОВАТЬ : отношение новых строк к строкам замены будет очень сильно наклонено к новым строкам. В данных, полученных из производства, для каждой коррекции обычно будет 100-1000 новых строк.
РЕДАКТИРОВАТЬ 2 : и вставки, и удаления должны обрабатываться как одна транзакция. Если при вставке или удалении происходит сбой, их необходимо откатить, оставив таблицу в том же состоянии, в котором она находилась до начала операций вставки и удаления.
EDIT 3 : Относительно пустых тегов. Сначала мне нужно кратко описать систему. Это база данных для торговой системы. MyTable - это таблица сделок, содержащая два вида сделок: так называемые «дневные сделки» и так называемые «открытие позиций». Дневные сделки - это просто сделки - если вы были трейдером опционов и совершали сделку, эта сделка была бы дневной сделкой в этой системе. Открытые позиции - это, в основном, сводка вашего портфеля до сегодняшнего дня. И открытые позиции, и дневные сделки хранятся в одной таблице. Дневные сделки имеют теги (либо longTags, либо числовые теги), а открывающие позиции - нет. Для открытия позиций могут быть повторяющиеся строки - это нормально и нормально. Но не может быть повторяющихся строк для дневных сделок. Если дневная сделка приходит с тем же тегом, что и некоторая запись, уже имеющаяся в базе данных, то данные в таблице заменяются новыми данными.
Таким образом, есть 4 возможности для значений в теге & longTag:
1) тег не равен нулю, а longTag пуст: это дневная сделка с числовым идентификатором.
2) тег равен нулю, а longTag имеет непустое символьное значение. Это дневная сделка с буквенно-цифровым идентификатором.
3) тег равен нулю, а longTag пуст: это открытая позиция.
4) тег ненулевой и longTag имеет непустое символьное значение. Это предотвращается от всего, что происходит с помощью нашего серверного программного обеспечения, но если это произойдет, longTag будет проигнорирован, и он будет рассматриваться так же, как и в случае №1. Опять же этого не происходит.