Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Долгий delete через index  [new]
Long_delete
Guest
С недавнего времени без видимых причин ухудшилась время работы сервера. Большую часть времени составляют запросы типа

delete from table where ID=12345


Таблицы небольшие, около 30000 записей. Удаление стало занимать 20-30 секунд против долей секунды ранее.

Таблицы с индексом. Заметил интересную особенность. Если удалить индекс, тогда delete проходит очень быстро. С индексом же - те же 20-30 секунд.

Блокировок нет. Для теста создал новую таблицу, наблюдается та же картина.

Может у кого есть идеи, как вернуть ситуацию в норму?
27 сен 13, 21:11    [14895049]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
Long_delete
Guest
insert, update, select выполняются также быстро. Проблема только с delete.
27 сен 13, 21:15    [14895065]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31968
Long_delete,

Какая то мистика, не может удаление одной записи по ПК занимать 30 секунд, даже если там 100 индексов.

Может, триггер DDL есть какой нибуть?
27 сен 13, 21:29    [14895093]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31968
Long_delete
Для теста создал новую таблицу, наблюдается та же картина.
А покажите репро-скрипт?
27 сен 13, 21:29    [14895096]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
Long_delete
Guest
alexeyvg,

ID не уникальный, на тестовом примере удаляется 5500 записей.

SELECT * INTO ttt
   FROM pAPI_UserRight

CREATE UNIQUE NONCLUSTERED INDEX [tttt_UR] ON [dbo].ttt 
(
	[SPID] ASC,
	[UserID] ASC,
	[UserResType] ASC,
	[ResourceID] ASC
)
GO

UPDATE STATISTICS ttt tttt_UR


Следующая команда выполняется за долю секунды

SELECT * 
   FROM ttt p WITH (INDEX=tttt_UR) 
   where p.SPID = 53


Эта тоже

   UPDATE ttt
   SET userid = userid + 1
   where SPID = 53  


Здесь висит 20-30 секунд. Можно без rowlock, без index, без with.

   delete ttt                                          
    from ttt p  WITH (ROWLOCK INDEX=tttt_UR)          
   where p.SPID = 53
27 сен 13, 21:45    [14895135]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31968
Long_delete
CREATE UNIQUE NONCLUSTERED INDEX [tttt_UR] ON [dbo].ttt 
(
	[SPID] ASC,
	[UserID] ASC,
	[UserResType] ASC,
	[ResourceID] ASC
)
GO
Это все поля в таблице?
Другие индексы есть?

Я не ошибусь, если скажу, что все запросы строятся с условием по полю [SPID]?
Я бы тогда сделал индекс кластерным.


Long_delete
Здесь висит 20-30 секунд. Можно без rowlock, без index, без with.

   delete ttt                                          
    from ttt p  WITH (ROWLOCK INDEX=tttt_UR)          
   where p.SPID = 53
Сколько строк удаляется, милион? ROWLOCK если убрать, будет то же самое?

И вы бы лучше привели скрипт сохдания таблицы со всем, что там у неё есть.

А то у меня нет таблицы pAPI_UserRight :-)
27 сен 13, 22:33    [14895278]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
Long_delete
Guest
alexeyvg, спасибо за участие.

Да, все запросы идут по SPID. Что-то менять (индексы, например), конечно, можно, но нежелательно, потому что обновление софта эти изменения затрут.

Сервер боевой, получил окно для перезагрузки (другие идеи иссякли), после нее ситуация нормализовалась.
28 сен 13, 00:38    [14895607]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31968
Long_delete
получил окно для перезагрузки (другие идеи иссякли), после нее ситуация нормализовалась.
Мда, чудеса, затрудняюсь сделать какие то предположения :-(
28 сен 13, 21:26    [14897368]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Это у Вас в любой БД так или в кокой-то конкретнной?
Нельзя ли увидеть параметры этой (этих) БД?
Какие колонки в проблемной таблице (тип и размер)?
Также на плохо бы взглянуть на план delete.
30 сен 13, 10:23    [14899921]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Long_delete,

foreing key constraint...
30 сен 13, 10:40    [14899995]     Ответить | Цитировать Сообщить модератору
 Re: Долгий delete через index  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31968
MasterZiv
Long_delete,

foreing key constraint...
ТС ведь говорит, что это происходит и на новой, только что созданной табличке...
30 сен 13, 11:01    [14900086]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить