2013-05-23 19 views
7

tôi cố gắng để tìm hiểu việc thực hiện hoặc thực hiện nội bộ cho WAITFOR trong T-SQL, đã trải qua MSDN và Stackoverflow và các trang web khác mà không có may mắn, đây là câu hỏi của tôiTác động của WAITFOR đối với các quy trình và giao dịch khác là gì?

Đối dưới mã, tôi muốn xóa phía trên 10.000 các hàng từ bảng DUMMY. Tôi muốn thực hiện công việc xóa này có tác động ít nhất về hiệu suất trên các công việc khác của cơ sở dữ liệu càng tốt và ưu tiên cho những người khác (nếu có). Vì vậy, tôi làm cho nó xóa 100 hàng tại một thời điểm và làm điều đó 100 lần với thời gian ngủ trong hai lần xóa liền kề.

Câu hỏi:

  1. Trong thời gian chặn WAITFOR, giao dịch này sẽ tiêu thụ CPU hay chỉ là nhàn rỗi và chờ đợi cho đá lên bởi một số sự kiện 1 giây sau?

  2. Trong thời gian đó 1 giây, nếu có các giao dịch khác đang cố gắng để INSERT/UPDATE trên bảng DUMMY, ai được ưu tiên?

Thật đánh giá cao sự giúp đỡ của bạn hoặc bất kỳ những hiểu biết cho điều này

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

Đối với điểm 2, tùy thuộc vào việc bạn đã hiển thị cho chúng tôi toàn bộ mã - nếu mã đang chạy bên trong một giao dịch, điều đó sẽ thay đổi mọi thứ –

+0

@Damien_The_Unbeliever cảm ơn vì đã chỉ ra, nó không nằm trong BEGIN TRAN ... COMMIT block, chỉ tsql được bọc trong perl. –

+1

Nếu bạn thực sự muốn giảm thiểu tác động, hãy đảm bảo có chỉ mục trên FOO –

Trả lời

18
  • Nó không tiêu thụ bất kỳ CPU
  • Status = lơ lửng

Bạn có thể thấy điều này với 2 truy vấn cửa sổ:

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

Sau đó, trong khác

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

Lưu ý: SQL Server 2012 SP1 nhưng AFAIK hành vi được cùng

điểm 2, xin lỗi bỏ lỡ này

phiên khác sẽ sửa đổi các bảng trong khi WAITFOR đang chạy. Nó không phải là một khóa.

+1

cảm ơn gbn, câu trả lời và thử nghiệm của bạn rất hữu ích! không biết chúng ta có thể làm điều gì đó như thế này trước đây. cảm ơn rất nhiều! –

Các vấn đề liên quan