Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DELETE FROM TAB1 WHERE COL1='12345'  [new]
Alex2
Guest
Каким образом я могу выполнить
DELETE FROM TAB1 WHERE COL1='12345'
чтобы не писать в LOG
Может есть какая опция, указывающая серваку чтобы он не протоколировал удаление данных и таблицы, то есть отрабатывал как truncate table, только по условию
6 фев 03, 16:51    [123633]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
нет.
6 фев 03, 16:54    [123641]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Kilroy
Member

Откуда: Москва
Сообщений: 249
Никаким
6 фев 03, 16:55    [123642]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
alex2
Guest
может DBCC traceon (????) ?
6 фев 03, 17:06    [123655]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
alex2
Guest
Слабо?
6 фев 03, 17:56    [123712]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
Встречный вопрос: зачем?
P.S. Транкэйт тоже протоколируется.
6 фев 03, 18:35    [123757]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
cvasil
Member

Откуда:
Сообщений: 519
>Alex2

Избежать переполнения лога при удалении данных можно так:

set rowcount 10000 -- количество строк, которое будет удаляться в транзакции


select 'Delete'
while @@rowcount>0
DELETE FROM TAB1 WHERE COL1='12345'
set rowcount 0
6 фев 03, 18:37    [123758]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
>cvasil
А Вы не объясните каким образом можно избегать переполнения лога таким образом ?
Если я правильно понимаю:

предположим что условие where col1 = '...' возвращает 10000 строк
если я напишу
DELETE FROM TAB1 WHERE COL1='12345'
это запротоколируется в лог как одна "большая" транзакция
через курсор - 10000 маленьким транзакций.
В чем разница ?
ИМХО, такое можно применять только при разветленной структуре репликации транзакций.

jimmers
Если не секрет, каким образом Вы выяснили, что truncate "записывается" в лог ?
6 фев 03, 20:10    [123834]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
cvasil
Member

Откуда:
Сообщений: 519
>Белов Владимир
Подразумевается что база находится в "simple" recovery mode и транзакционная
репликация отсутствует.
При этом лог может транкироваться после выполнения одной или нескольких маленьких
транзакций, и место будет высвобождено для следующих.

Для случаев с full recovery mode или репликацией - IMHO только увеличивать размер
лога или избегать таких больших транзакций в принципе.
6 фев 03, 20:56    [123859]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
>cvasil
Как бы сложно и согласиться и не согласиться :-)

1. Через курсор будет работать нааамного дольше
2. Чем мешает такая транзакция ?

При модели сампл - сервер сам определяет когда ему урезать транзакшн лог.
Но преположительно, насколько я помнб, по дефоулту, чекпоинт происходит где-то раз в минуту. Я думаю что за 1 минуту удалится даже через курсор 10 тыс записей.
6 фев 03, 22:05    [123875]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
cvasil
Member

Откуда:
Сообщений: 519
>1. Через курсор будет работать нааамного дольше
Количество строк, удаляемых за одну транзакцию, определяется в стэйтменте
set rowcount и может быть любым, не обязятельно единица как при использовании курсора.
Я вообще курсор нигде не упоминал.

>2. Чем мешает такая транзакция ?
Очень большая транзакция может не поместиться в лог и будет откачена сервером.
Обычно транзакции с удалением 10000 строк проблем не вызывают.
Сложности начинаются когда удаляются миллионы строк.

>При модели сампл - сервер сам определяет когда ему урезать транзакшн лог.
>Но преположительно, насколько я помнб, по дефоулту, чекпоинт происходит
>где-то раз в минуту. Я думаю что за 1 минуту удалится даже через курсор 10
>тыс записей.

Частота выполнения чекпойнта зависит от степени заполнения лога, размера его активной части,
а также параметра конфигурации сервера "recovery interval". Смотри BOL->CHECKPOINT
7 фев 03, 00:10    [123909]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
Да, cvasil правильно говорит.

Иногда при удалении 200 000 записей лог и сервер сходят с ума, тормозят все что можно и приходится откатывать недожидаясь.
А по 10 000 записей все проходит быстро и без особых мучений лога :)
7 фев 03, 10:19    [124059]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
>cvasil
Упс, был не прав
чего меня переглючило, и померещелось что ты используешь курсор :-)
7 фев 03, 10:56    [124117]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
2Белов Владимир

Ну как где - BOL:

TRUNCATE TABLE removes the data by deallocating the data pages used to store the table's data, and only the page deallocations are recorded in the transaction log.
7 фев 03, 11:11    [124130]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
ALEX2
Guest
У меня в таблице 20 000 000 строк
надо убить 1 000 000
Неужели нет быстрого способа???
На таблице стоит кластерный индекс
Может в этом причина тормоза?
7 фев 03, 14:21    [124394]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
Ну судя по всему, сами данные при truncate в лог не записываются, а просто сохраняется, что "вот такие страницы были truncate" - блин немного коряво получилось.
7 фев 03, 14:40    [124418]     Ответить | Цитировать Сообщить модератору
 Re: DELETE FROM TAB1 WHERE COL1='12345'  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
сами данные при truncate в лог не записываются

Само собой - деаллокация экстентов журналируется. Просто некоторые думают, что при truncate вообще ничего не пишется в журнал.
7 фев 03, 14:58    [124449]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить