Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очистка лога транзакций во время выполнения бооольшой транзакции... / 21 сообщений из 21, страница 1 из 1
06.08.2018, 18:15
    #39683889
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Добрый день.


Есть запрос, который удаляет огромное количество данных из таблицы (примерно 150 Гб).

Код: sql
1.
delete from table where a=1



Но при этом в лог транзакций генерируется куча данных.

И лог иногда перестает влазить на диск.

удаление длится примерно 3 часа.

Бэкап лога прямо во время выполнения этого удаления должен ли очищать лог?

Или он не сможет очистить то что генерирует открытая транзакция?
...
Рейтинг: 0 / 0
06.08.2018, 18:20
    #39683894
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
А что должно произойти в случае, если вы забэкапите лог, сервер его почистит, а потом транзакция захочет откатиться?
...
Рейтинг: 0 / 0
06.08.2018, 18:22
    #39683896
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Гавриленко Сергей АлексеевичА что должно произойти в случае, если вы забэкапите лог, сервер его почистит, а потом транзакция захочет откатиться?

Я вот тоже думаю что он очищать текущие транзакции не могёт.

Ну и бэкап лога это подтверждает - не очищает.

Хотел убедиться.



А во время перестройки индекса получается такая же ситуация - бэкапь не бэкапь лог: он не очистится?
...
Рейтинг: 0 / 0
06.08.2018, 18:24
    #39683898
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
пятый2Или он не сможет очистить то что генерирует открытая транзакция?

не сможет

используйте батчи

например

Код: sql
1.
2.
3.
4.
5.
delete top (30000) from [TBL] where a=1

while @@rowcount <> 0 

delete top (30000) from [TBL] where a=1
...
Рейтинг: 0 / 0
06.08.2018, 18:28
    #39683901
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
komradпятый2Или он не сможет очистить то что генерирует открытая транзакция?

не сможет

используйте батчи

например

Код: sql
1.
2.
3.
4.
5.
delete top (30000) from [TBL] where a=1

while @@rowcount <> 0 

delete top (30000) from [TBL] where a=1



Спасибо, попробую так.

Наверное еще на каждом шаге бэкап лога как-нить всуну.
...
Рейтинг: 0 / 0
06.08.2018, 18:33
    #39683903
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Может, стоит секционировать по полю "a" как-нибудь и транкейтить секции?
...
Рейтинг: 0 / 0
06.08.2018, 18:34
    #39683904
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Гавриленко Сергей АлексеевичМожет, стоит секционировать по полю "a" как-нибудь и транкейтить секции?

Тоже хороший вариант, благодарю.
...
Рейтинг: 0 / 0
06.08.2018, 19:44
    #39683942
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
10 раз подумайте прежде чем секционировать... некоторые запросы возможно придется менять.

Я за вариант удаления пачками.
Найдите кол-во записей в пачке экспериментально.

Код: sql
1.
2.
3.
4.
5.
6.
while 1=1
begin
    delete top (1000) from [TBL] where a=1
    if @@rowcount = 0 break
    waitfor delay '00:00:01' -- я еще обычно добавляю задержку чтобы не грузить сильно сервер.
end



Для такого запроса обязательно нужен индекс по полю "a", иначе такое удаление только хуже сделает.
Код: sql
1.
create index IDX_TBL_A on dbo.TBL ( a );
...
Рейтинг: 0 / 0
06.08.2018, 19:48
    #39683944
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Владимир Затуливетер10 раз подумайте прежде чем секционировать... некоторые запросы возможно придется менять.

Я за вариант удаления пачками.
Найдите кол-во записей в пачке экспериментально.

Код: sql
1.
2.
3.
4.
5.
6.
while 1=1
begin
    delete top (1000) from [TBL] where a=1
    if @@rowcount = 0 break
    waitfor delay '00:00:01' -- я еще обычно добавляю задержку чтобы не грузить сильно сервер.
end




Для такого запроса обязательно нужен индекс по полю "a", иначе такое удаление только хуже сделает.
Код: sql
1.
create index IDX_TBL_A on dbo.TBL ( a );



Да, да, секционирование это зло, а вот поддерживать доп индекс на таблице и добавить "лукап" в кластерный индекс при удалении это "best practices"
...
Рейтинг: 0 / 0
06.08.2018, 19:49
    #39683945
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
А огромное кол-во данных это какой процент от всех данных в таблице? А то может проще перенести все что надо в новую табличку, а эту дропнуть?
...
Рейтинг: 0 / 0
06.08.2018, 20:07
    #39683954
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
msLex,
авторДа, да, секционирование это зло, а вот поддерживать доп индекс на таблице и добавить "лукап" в кластерный индекс при удалении это "best practices"

это как-то специально надо заставить это сделать?
...
Рейтинг: 0 / 0
06.08.2018, 20:24
    #39683964
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
пятый2Добрый день.


Есть запрос, который удаляет огромное количество данных из таблицы (примерно 150 Гб).

Код: sql
1.
delete from table where a=1



Но при этом в лог транзакций генерируется куча данных.

И лог иногда перестает влазить на диск.

удаление длится примерно 3 часа.

Бэкап лога прямо во время выполнения этого удаления должен ли очищать лог?

Или он не сможет очистить то что генерирует открытая транзакция?
А можно так.
Сделать выгрузку из таблицы table в CSV where a <> 1.
Затем загрузку пакетом SSIS с Fast load в чистую вновь созданную таблицу table_new.
Затем переименование table в table_old и table_new в table внутри одной транзакции с обработкой исключения.
И после этого делать бэкап журнала транзакций.

Если что-то важное удалится, а реально столбец для этой строки был не a=1, а a=2, то найти нужную строку в table_old и загрузить ее одну такую в table будет проще, чем с воплями "где таки свободное дисковое пространство" разворачивать полный бэкап базы рядом и дальше после этого искать в базе-копии эту единственную строку.

То есть я предлагаю Вам посмотреть чуть дальше привычного горизонта планирования. А место внутри БД можно всегда получить через truncate table_old перед полным бэкапом БД, MSSQL поймет, что там были реальные строки, а теперь страницы с пустым местом для новых таблиц - и не будет эту пустоту записывать в бэкап.
...
Рейтинг: 0 / 0
06.08.2018, 20:28
    #39683966
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Andy_OLAP,

Более того, имея копию одной большой таблицы, но одной, в файле CSV - можно ее в любой момент загрузить внутрь этой базы данных в таблицу table_old_copy_before_delete и поискать там.

А если файлы CSV сжимать в архив и складывать на дешевую дисковую полку - то при необходимости можно будет в любой момент сделать bulk insert через SSIS пакет в таблицу table_old_copy_before_delete_in_date_20180803 и другой CSV в таблицу table_old_copy_before_delete_in_date_20180806 - и сравнить между собой.

Иногда такое сравнение дает исключительно положительный и неожиданный эффект.
...
Рейтинг: 0 / 0
06.08.2018, 20:50
    #39683971
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
msLexДа, да, секционирование это зло, а вот поддерживать доп индекс на таблице и добавить "лукап" в кластерный индекс при удалении это "best practices"
Да, да, как буд-то секционирование дается нам "бесплатно".
Я сказал подумать. Если автор только складывает и удаляет, то однозначно секционирование.
А вот если у него куча разных запросов, которым поплохеет после вашего секционирования, да еще и новые значения добавляются в столбец "а" переодически, то кто заплатит за рефекторинг и поддержку софта автора?
...
Рейтинг: 0 / 0
06.08.2018, 22:14
    #39683983
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
пятый2
Наверное еще на каждом шаге бэкап лога как-нить всуну.

ну безусловно, либо через N-ое кол-во циклов

кстати, бекап в NUL работает безотказно и места не занимает, хотя с компрессией не совместим )
...
Рейтинг: 0 / 0
07.08.2018, 00:13
    #39684006
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Владимир ЗатуливетерmsLexДа, да, секционирование это зло, а вот поддерживать доп индекс на таблице и добавить "лукап" в кластерный индекс при удалении это "best practices"
Да, да, как буд-то секционирование дается нам "бесплатно".
Я сказал подумать. Если автор только складывает и удаляет, то однозначно секционирование.
А вот если у него куча разных запросов, которым поплохеет после вашего секционирования, да еще и новые значения добавляются в столбец "а" переодически, то кто заплатит за рефекторинг и поддержку софта автора?Если выпиливание 150 Гб данных командой delete (да еще, по вашей версии, и по некластерному индексу) -- это не повод задуматься о секционировании, то я уж даже не знаю, что может быть таким поводом. Но я уже испорчен наличием AlwaysOn -- сия волшебная технология быстро отучает нагружать лог всякой ненужной фигней.
...
Рейтинг: 0 / 0
07.08.2018, 06:54
    #39684027
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
В каждом решении есть плюсы и минусы, давайте предоставим выбор автору темы. Мы не знаем что у него там, у нас только предположения.

А по поводу некластерного индекса, это не важно что мы удаляем по нему. Это бэкграунд таск, задержкой мы можем регулировать нагрузку. Он может удалять данные и 10 часов и неделю. Главное чтобы это автора темы устраивало.
...
Рейтинг: 0 / 0
07.08.2018, 09:57
    #39684071
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
В схожем случае выпиливал записи курсором (delete...current of). По одной, зато сразу и без накладных расходов.
...
Рейтинг: 0 / 0
07.08.2018, 12:23
    #39684181
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Владимир Затуливетер10 раз подумайте прежде чем секционировать... некоторые запросы возможно придется менять.

Я за вариант удаления пачками.
Найдите кол-во записей в пачке экспериментально.

Код: sql
1.
2.
3.
4.
5.
6.
while 1=1
begin
    delete top (1000) from [TBL] where a=1
    if @@rowcount = 0 break
    waitfor delay '00:00:01' -- я еще обычно добавляю задержку чтобы не грузить сильно сервер.
end



Для такого запроса обязательно нужен индекс по полю "a", иначе такое удаление только хуже сделает.
Код: sql
1.
create index IDX_TBL_A on dbo.TBL ( a );




Индекс есть.

На счет задержки, спасибо.
...
Рейтинг: 0 / 0
07.08.2018, 12:26
    #39684183
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
Andy_OLAPAndy_OLAP,

Более того, имея копию одной большой таблицы, но одной, в файле CSV - можно ее в любой момент загрузить внутрь этой базы данных в таблицу table_old_copy_before_delete и поискать там.

А если файлы CSV сжимать в архив и складывать на дешевую дисковую полку - то при необходимости можно будет в любой момент сделать bulk insert через SSIS пакет в таблицу table_old_copy_before_delete_in_date_20180803 и другой CSV в таблицу table_old_copy_before_delete_in_date_20180806 - и сравнить между собой.

Иногда такое сравнение дает исключительно положительный и неожиданный эффект.

Интересный вариант, мини архив получается.
...
Рейтинг: 0 / 0
07.08.2018, 12:34
    #39684190
пятый2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очистка лога транзакций во время выполнения бооольшой транзакции...
В общем, удаляю в цикле с задержкой, итерациями примерно по 2-3 минуты, мониторя размер лога и делая бэкап.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очистка лога транзакций во время выполнения бооольшой транзакции... / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]