Должен быть способ удалить данные в SQL Server w/o перегрузка журнала

Я буду честен. Я только недавно начал писать модульные тесты, и когда я возвращаюсь для изменения старого DLL, это с моих плохих былых времен, я буду сидеть на корточках и писать модульные тесты для получения его около 100%-го покрытия кода. Я говорю "рядом", потому что последний несколько процентов может быть трудно получить до должного к способу, которым код структурирован, что это не имело насмешки или поблочного тестирования в виду (это происходит много с абстрактными классами или классами что P/Invoke в собственный код). И в то время как я понимаю, что 100%-е покрытие кода не является тем же самым, поскольку 100% всего выполнения кода соединяют каналом, я нашел, что наличие тестов существует хороший способ сказать, когда я делаю что-то, что это собирается повредить много вещей.

Честно говоря, это - вероятно, одна причина, почему потребовались многие разработчики (включая меня) так долго для возвращения для принятия поблочного тестирования (просто еще давайте не входить в TDD).

я не говорю, что любой из них является законными причинами, но они действительно более или менее проносились в моей голове, и я держал пари, что они прошли некоторых ваших также:

  • Первый, существует мысль вроде, "О, я записал горы кода с нулевыми тестами, и видящий, поскольку я уже сокрушен той горой, у меня возможно нет времени для добавления еще нескольких гор тестового кода сверху его".

  • 1118-секундный, никому не нравится говорить о том, что классический цикл управляемой отладки кода на самом деле работает "достаточно хороший", когда Вы

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

  • Четвертое, поблочное тестирование является довольно недавними инновациями. (О, тишина... Я знаю, что идея была вокруг навсегда, особенно в для решения ответственных задач и приложениях DoD, но для "Joe Водопроводчик Разработчик" типы как я? Поблочное тестирование не было упомянуто вообще во время моей всей карьеры студента CS в начале этого десятилетия; в 2008 я слышу, что это - требование для всех проектов от уровня 101. Visual Studio даже не получала встроенную среду тестирования до этого года, и даже тогда только в профессиональном выпуске.) Был он блаженное неведение с моей стороны? Несомненно, и я думаю много людей, которые кодируют, потому что это - их дневное задание (который прекрасен), просто не знают. Если они, то они знают, что должны остаться текущими, но когда дело доходит до изучения новой методологии (особенно та, которая включает запись большего количества кода и взятие более первичного времени, когда Вам была нужна та новая возможность, сделанная вчера ) означает, что это будет пододвинуто обратно. Это - длинный хвост, и приблизительно через одно десятилетие наши переговоры о поблочном тестировании будут казаться столь же странными как наше бормотание об объектно-ориентированном программировании, разрешающем новую эру разработки в течение 1990-х. Heck, если я имею , запустил поблочное тестирование, конец должен быть рядом, потому что я обычно - идиот.

  • Пятое, поблочное тестирование некоторые области кода являются действительно трудными, и это отпугнуло меня некоторое время. Многопоточные очереди событий, графический рендеринг и графический интерфейсы пользователя приходят на ум. Многие разработчики понимают это и думают "хорошо heck, поблочное тестирование было бы большим для кода библиотеки, но когда был прошлый раз, когда я записал просто библиотеку классов". Это требует времени, чтобы прийти. С этой целью, никакие модульные тесты не обязательно означает, что плохой код предстоит в будущем.

  • Наконец, уровень евангелизма, который иногда прибывает от защитников поблочного тестирования, может быть пугающим и нерасполагающим. Серьезно, я думал, что был идиотом, потому что я просто не мог схватить, как дразнить определенный интерфейс и почему я захочу. Эгоистично, я хотел ненавидеть поблочное тестирование, если только для того, что все не замолчат об этом . Никакая серебряная пуля.

Так, извинения за хаотичное сообщение. Таким образом:

  • я не делал модульного теста в течение долгого времени. Теперь я делаю. Модульные тесты являются большим инструментом, особенно во время обслуживания.

  • Для существующих проектов, можно, по крайней мере, войти и записать тест, который документирует текущий вход и его вывод. При изменении той большой путаницы темного кода в будущем Вы будете в состоянии видеть, изменили ли Вы тот небольшой снимок. Это - также отличный способ изменить культуру разработки в Вашей компании.

Позволяют провокационным сообщениям начаться! =)

5
задан OMG Ponies 19 September 2009 в 17:39
поделиться

3 ответа

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

Проблема в том, что журнал заполнен и, следовательно, должен увеличиваться. Если он заполнен, попытки сжать его бесполезны, в журнале нет свободного места для передачи в ОС. Вместо этого вам нужно сделать пространство внутри файла доступным для повторного использования.

Поскольку БД находится в режиме простого восстановления, запускайте удаление по частям с командой CHECKPOINT между каждым фрагментом. Вы не можете делать резервные копии журналов в Простом восстановлении

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

(SQL 2005 и выше. Для SQL 2000 удалите TOP и используйте SET ROWCOUNT)

DECLARE @Done BIT
SET @Done = 0
WHILE @Done = 0
  BEGIN
    DELETE TOP (20000) -- reduce if log still growing
      FROM SomeTable WHERE SomeColumn = SomeValue 
    IF @@ROWCOUNT = 0 
      SET @Done = 1
    CHECKPOINT -- marks log space reusable in simple recovery
  END

Чтобы понять управление журналами , взгляните на эту статью - http://www.sqlservercentral.com/articles/64582/

14
ответ дан 18 December 2019 в 09:08
поделиться

Один трюк, который я использовал в зависимости от размера данных, которые я храню, и количества, которое я удаляю, заключается в следующем:

  1. выбрать все "данные для хранения" в другом таблица (только для временного хранилище)

  2. обрезать исходную таблицу

  3. вставить все данные из таблицы временного хранения обратно в исходную

Это хорошо работает, если объем, который вы храните, меньше, чем тот, который вы удаляете.

Аналогичное вариант, если все файлы базы данных находятся на одном диске (данные и журналы), а данные, подлежащие удалению, составляют примерно половину данных, можно было бы экспортировать «данные для хранения» в файл на отдельном диске с помощью команды bcp line, затем усеките и снова вставьте файл данных с помощью bcp.

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

4
ответ дан 18 December 2019 в 09:08
поделиться

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

0
ответ дан 18 December 2019 в 09:08
поделиться