Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
Добрый день!

Есть таблица:
create table dbo.Tbl
(ClientID int		not null
,Date	smalldatetime	not null
,packet image		null

PRIMARY KEY CLUSTERED 
(
	ClientID ASC,
	Date ASC
))

Размер таблицы 10 млн. строк и 50Гб данных.
Различных ClientID около 1000.
Модель восстановления Full.
Размер журнала транзакций достаточно большой.

Стоит задача удалить строки where packet is null. Таких строк около 50000.
Если запустить удаление просто:
delete from dbo.Tbl where packet is null

То запрос будет выполняться десятки минут.

А если сделать, например, так:
declare @clientid int

select @clientid =min(ClientID)
from dbo.Tbl

begin
begin tran

delete from dbo.Tbl 
where ClientID = @clientid
  and packet is null

select @clientid =min(ClientID)
from dbo.Tbl
where ClientID >@clientid 

commit
end

То удаление выполнится в десятки раз быстрее.
Почему так?
9 окт 12, 11:41    [13289139]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
Glory
Member

Откуда:
Сообщений: 104760
LelikB
Почему так?

Потому что это разные запросы ?
9 окт 12, 11:42    [13289155]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
LelikB,
Блокировки не пробовали смотреть?
9 окт 12, 11:42    [13289156]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
Glory
Потому что это разные запросы ?

Да, разные.
Но я ставил еще один эксперимент. Запускал:
delete from dbo.Tbl
where Clientid=1
 and packet is null

и в цикле while по @date:
...
begin tran
...
delete from dbo.Tbl
where Clientid=1
  and date = @date
  and packet is null
...
commit
...

В обоих случаях - Index Seek по кластерному индексу.

denis2710
LelikB,
Блокировки не пробовали смотреть?

Эксперименты ставлю на тесте, на нем никто кроме меня не работает.
Если сделать with(tablock), то результаты примерно те же.
9 окт 12, 11:51    [13289250]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
Glory
Member

Откуда:
Сообщений: 104760
LelikB
В обоих случаях - Index Seek по кластерному индексу.

Наверное потому, что использовано поля, входящее в индекс ?
Причем в уникальный индекс
9 окт 12, 11:54    [13289284]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
Glory,

Я не дописал, что первый вариант (where Clientid=1 and packet is null) все равно отрабатывает дольше, чем (where Clientid=1 and date = @date and packet is null) в цикле по всем date.
9 окт 12, 11:58    [13289332]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
LelikB
Glory,

Я не дописал, что первый вариант (where Clientid=1 and packet is null) все равно отрабатывает дольше, чем (where Clientid=1 and date = @date and packet is null) в цикле по всем date.

Ну так кол-во записей явно разное!!
9 окт 12, 11:59    [13289345]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
denis2710,
что ж такое сегодня , неправильно я написал.
9 окт 12, 12:02    [13289364]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
denis2710
Ну так кол-во записей явно разное!!

Почему разное?
В первом случае (where Clientid=1 and packet is null) записей 2000.
Во втором случае, где цикл по date: (where Clientid=1 and date = @date and packet is null) их тоже в сумме 2000. В каждой транзакции да, меньше.
9 окт 12, 12:03    [13289372]     Ответить | Цитировать Сообщить модератору
 Re: Удаление строк из таблицы. Одна длинная транзакция или много коротких?  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
LelikB,
Нашел ответ на мой вопрос:
Timeouts on delete with Image and Varbinary(max) data
9 окт 12, 16:22    [13291552]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить