2013-05-23 5 views
7

Я пытаюсь выяснить, производительность или внутреннюю реализацию WAITFOR в T-SQL, которые прошли через MSDN и Stackoverflow и другие сайты без удачи, вот мой вопросКакое влияние WAITFOR на другие процессы и транзакции?

Для ниже коды, я хочу, чтобы удалить верхние 10000 строки из таблицы DUMMY. Я хочу, чтобы это задание удаления имело наименьшее влияние на производительность других рабочих мест базы данных и отдавало приоритет другим (если они есть). Поэтому я делаю это, чтобы удалить 100 строк за раз и сделать это 100 раз со временем сна в двух соседних удаленных.

Вопрос:

  1. В WAITFOR время блокировки, будет эта транзакция потребляет процессор или просто простаивает, ожидая поднятый некоторое событие на 1 секунду позже?

  2. В течение 1 секунды, если есть другие транзакции, пытающиеся сделать INSERT/UPDATE на столе DUMMY, кто получает приоритет?

Благодарим Вас за помощь или какие-либо идеи для этого

declare @cnt int 
set @cnt = 0 
while @cnt < 100 
begin 
    delete top 100 from DUMMYTABLE where FOO = 'BAR' 
    set @cnt = @cnt + 1 
    waitfor delay '00:00:01' 
end 
+0

Для пункта 2 это зависит от того, показываете ли вы нам весь код - если код работает внутри транзакции, что меняет все –

+0

@Damien_The_Unbeliever спасибо за указание, это не в BEGIN TRAN ... Блок COMMIT, только tsql, завернутый в perl. –

+1

Если вы действительно хотите минимизировать воздействие, убедитесь, что есть указатель на FOO –

ответ

18
  • Он не потребляет процессор
  • Status = приостановлено

Вы можете увидеть это с 2-запроса окна:

SELECT @@SPID; 
GO 
WAITFOR DELAY '000:03:00'; -- three minutes 

Тогда в другой

SELECT * FROM sys.sysprocesses S WHERE S.spid = 53; -- replace 53 

Примечание: SQL Server 2012 SP1, но AFAIK поведение такое же,

пункт 2, жаль пропустил это

Другая сессия будет модифицировать таблицу в то время как WAITFOR бежит. Это не замок.

+1

спасибо gbn, ваш ответ и эксперимент настолько полезны! не знаю, что мы можем сделать что-то подобное раньше. большое спасибо! –