Sql Server, найти все строки, которые были обновлены оператором - PullRequest
1 голос
/ 07 июля 2010

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

У меня есть несколько больших (2M-10M) таблиц строк в Sql Server, и я добавляю триггеры аудита, чтобы отслеживать, когда обновляются записи и из-за чего проблема в том, что это снижает производительность. Большинство обновлений для таблицы коснутся более 20 000 строк, и теперь они занимают в 5-10 раз больше времени, чем ранее.

Я думал о некоторых вариантах

1) Ditch срабатывает полностью и добавляет поля аудита в каждый оператор обновления, но это зависит от изменения кода каждого пользователя. 2) Используйте значения контрольной суммы до / после в полях, а затем используйте их, чтобы обновить измененные строки во второй раз, все еще снижая производительность.

Кто-нибудь еще решил эту проблему?

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

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

Другой вариант - это предложение OUTPUT для оператора UPDATE, представленное в SQL Server 2005. (обновлено после комментария Филиппа Келли)

2 голосов
/ 07 июля 2010

SqlServer знает, как выполнить откат, поскольку у него есть журнал транзакций.Это не то, что вы можете найти в таблицах данных.

Вы можете попробовать добавить столбец отметки времени в ваши строки, а затем сохранить «текущую» отметку времени, обновить все строки.Измененные строки должны быть всеми строками с отметкой времени, превышающей вашу «текущую» отметку времени.Это поможет вам найти измененные строки, но не найти то, что изменило их.

1 голос
/ 07 июля 2010

Вы можете использовать Отслеживание изменений или Сбор данных изменений .Это технологии, встроенные в Engine для отслеживания изменений и использующие инфраструктуру репликации (средство чтения журналов или триггеры таблиц).Оба доступны только в SQL Server 2008 или 2008 R2, а для CDC требуется лицензирование Enterprise Edition.

Все, что вы попытаетесь сделать, в конечном итоге сводится к одному из:

  • чтение журнала изменений (что возможно только для Replication, включая сбор данных изменений, в противном случае Engine перезапустит журнал до того, как вы сможете его прочитать)
  • отслеживает изменения в триггерах (именно это будет использовать отслеживание изменений)
  • отслеживание изменений в приложении

Бесплатного обеда просто не существует.Если аудит является требованием, то необходимо учитывать накладные расходы на аудит и планировать пропускную способность соответственно.Все решения по аудиту данных будут вызывать значительные накладные расходы, поэтому увеличение эксплуатационных расходов в 2, 4 или даже 10 раз не случайно.

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