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

Откуда:
Сообщений: 466
Добрый день.

Есть хп , в которой есть такой запрос :
......................

DECLARE
@MESSAGE_STATUS_ID INT,
@VOICE_EVENT_OUTGOING INT
SET @MESSAGE_STATUS_ID = 4
SET @VOICE_EVENT_OUTGOING = 3

BEGIN TRANSACTION


SELECT @outgoing_id = outgoing_id,
@b_number = b_number
FROM queue_message_outgoing WITH(TABLOCKX)
WHERE outgoing_id = (
SELECT MIN(outgoing_id) FROM queue_message_outgoing
WHERE voice_event_id = @VOICE_EVENT_OUTGOING AND time_start <= @current_time
)
SELECT @num=@@ROWCOUNT

IF @num <> 0
begin

UPDATE outgoing
SET voice_event_id = @MESSAGE_STATUS_ID
WHERE outgoing_id=@outgoing_id

IF @@ERROR <> 0
begin
SELECT @errornum = 20100,
@return_code = -1,
@errormsg = 'Îøèáêà ïðè îáíîâëåíèè äàííûõ '+'.'
+ '@outgoing_id' + convert(varchar(20),@outgoing_id)
GOTO ERROR_EXIT
end

UPDATE queue_message_outgoing
SET voice_event_id = @MESSAGE_STATUS_ID
WHERE outgoing_id=@outgoing_id
IF @@ERROR <> 0 OR @sp_result < 0
begin
SELECT @errornum = 20100,
@return_code = -2,
@errormsg = 'Îøèáêà â ÕÏ: ' + @sp_name + '. Îøèáêà ïðè îáíîâëåíèè ñòàòóñà â î÷åðåäè.'

GOTO ERROR_EXIT
end
ELSE
IF @num = 0
begin
SET @outgoing_id=0
SET @adress_system=null
end
end




COMMIT TRANSACTION


Есть подозрение на запрос,который выделен желтым цветом,т.к эта таблица outgoing имеет на данный момент свыше 500 000 строк,в будущем будет увеличиваться

Также есть индекс по полю outgoing_id

Пожалуйста помогите.


Заранее благодарен
11 дек 09, 12:31    [8052420]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
ИльдарSR,

зачем подозрения? :)

Посмотрите, сколько по времени выполняются части процедуры, какие у них планы, какие блокировки накладываются.
11 дек 09, 12:38    [8052495]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
Gueccct
Member [заблокирован]

Откуда: Киев, Норвегия
Сообщений: 2965
А индекс есть на outgoing_id?? Епт! Желтый цвет жжот, чуть глаза не повылазили.
11 дек 09, 12:39    [8052502]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Вопрос закрыт.Сделал подсказку,вроде работает пока нормально,но если у кого другие мысли,отсавьте коменты свои.


заранее спасибо
11 дек 09, 12:40    [8052522]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Индекс есть outgoing_id
11 дек 09, 12:41    [8052529]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
И что не так с вашей процедурой?
11 дек 09, 12:42    [8052534]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
aleks2
Guest
ИльдарSR
Вопрос закрыт.Сделал подсказку,вроде работает пока нормально,но если у кого другие мысли,отсавьте коменты свои.
заранее спасибо

А чо тут думать - классическая схема DEADLOCK.

1. Первый процесс запрашивает блокировку чтения queue_message_outgoing - ПОЛУЧАЕТ.
2. Второй процесс запрашивает блокировку чтения queue_message_outgoing - ПОЛУЧАЕТ.
3. Первый процесс запрашивает блокировку обновления queue_message_outgoing - НЕ ПОЛУЧАЕТ, ибо блокировано на чтение вторым процессом И ЖДЕТ не убирая блокировку чтения.
4. Второй процесс запрашивает блокировку обновления queue_message_outgoing - НЕ ПОЛУЧАЕТ, ибо блокировано на чтение первым процессом И ЖДЕТ не убирая блокировку чтения.
... так они и ждали. Глупее не напишешь.

Короче, критические секции не зря придумали.
11 дек 09, 13:06    [8052766]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос из-за которого происходит блокировка  [new]
vino
Member

Откуда:
Сообщений: 1191
aleks2, в данном случае не классическая схема, там есть TABLOCKX в первой выборке.
Но и это не спасает, так как есть GOTO ERROR_EXIT неизвестно куда, из-за чего ошибочная транзакция, возможно, зависает.
Тогда не ясно, что именно сделал
автор
Сделал подсказку,вроде работает пока нормально
11 дек 09, 13:54    [8053328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить