SQL Server сравнивает записи таблицы для обновления - PullRequest
1 голос
/ 27 мая 2010

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

Это не работает, когда мне дают 10 тысяч новых сделок. Даже пакетные операции чтения позволяют одновременно прочитать 1000 сделок и сравнить их. Весь процесс может занять несколько минут. Все время проведено в БД.

Я пытаюсь найти способ сравнить, возможно, новые сделки с теми, что указаны в таблице сделок, без особого ввода-вывода. До сих пор я придумывал добавление столбца хеш-функции к каждой строке в торговой таблице. Хэш всех торговых полей. Затем, когда мне дают, возможно, новые сделки, я вычисляю их хэш, помещаю значения во временную таблицу, а затем нахожу те, которые отличаются. Это кажется очень хакерским. Есть ли лучший способ сделать это?

Спасибо

- Немного больше информации

SQL Server 2008

Trade(rowid, tradeid, type, trader, volume, etc..) - rowid уникален, tradeid будет продублирован для разностных версий одной и той же сделки

Таблица содержит около 30 столбцов и не нормализована, поэтому в зависимости от type некоторые столбцы могут быть null. Кто-то публикует тысячи сделок в Java-сервлете, который затем должен добавить новую строку для любой сделки, которая изменилась. К сожалению, для того, чтобы сделать это, сервлет Java должен прочитать каждую из тысяч сделок и сравнить их.

Самой новой версией конкретной сделки является просто версия с самым высоким значением rowid.

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Если вы используете SQL Server 2008, вы можете использовать оператор MERGE .

Создайте индекс по столбцам, которые однозначно идентифицируют каждую сделку.

0 голосов
/ 27 мая 2010

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

Возможно сделать это в одном операторе вставки, если вы покажете нам некоторые дополнительные сведения о схеме таблицы и, в частности, о том, как определяется «последний» и как вы сопоставляете строки в двух таблицах (т. Е. Совпадает ключ две таблицы).

0 голосов
/ 27 мая 2010

Хеш не плохое решение. Это поможет, если вы опубликуете больше информации о структуре таблицы.

Стандартный способ сделать это - просто выполнить оператор UPDATE, предложение WHERE будет включать объединения ключевых полей: WHERE table.PRODUCT_ID = NEWTRADE.PRODUCT_ID; также проверьте поля значений: WHERE table.TRADE_AMOUNT <> newtrade.BIDAMOUONT; если вы проиндексируете таблицу по PRODUCT_ID - она ​​будет работать в миллисекундах.

Вы можете сначала вставить свои 10 с тысяч новых сделок в таблицу, а затем запустить UPDATE, чтобы присоединиться к основному столу с новыми сделками. еще раз, убедитесь, что у вас есть индексирование таблиц правильно.

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