Chúng tôi sử dụng cơ sở dữ liệu ASPState để duy trì trạng thái Phiên .NET trên cụm SQL Server 2005. Chúng ta đang thấy một số hành vi kỳ lạ trong thời kỳ cao điểm
Proc DeleteExpiredSments được chạy mỗi phút thông qua một công việc đại lý. Đôi khi công việc này mất nhiều phút để chạy và xóa các phiên hết hạn
Yêu cầu từ ứng dụng đến cơ sở dữ liệu ASPState rất chậm. Tôi tin rằng điều này là do có các khóa độc quyền đang được giữ trên bàn bằng thủ tục DeleteExpiredSments
Mã số:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[DeleteExpiredSessions]
AS
SET NOCOUNT ON
SET DEADLOCK_PRIORITY LOW
DECLARE @now datetime
SET @now = GETUTCDATE()
DECLARE @tblExpiredSessions TABLE
(
SessionID nvarchar(88) NOT NULL PRIMARY KEY
)
INSERT INTO @tblExpiredSessions (SessionID)
SELECT SessionID
FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
WHERE Expires < @now
--EXPIRED SESSION LOGGING
/*
DECLARE @ExpiredSessionCount Int;
SELECT @ExpiredSessionCount = COUNT(SessionID)
FROM @tblExpiredSessions;
*/
IF @@ROWCOUNT <> 0
BEGIN
DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR SELECT SessionID FROM @tblExpiredSessions ORDER BY CHECKSUM(NEWID())
DECLARE @SessionID nvarchar(88)
OPEN ExpiredSessionCursor
FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM [ASPState].dbo.ASPStateTempSessions WHERE SessionID = @SessionID AND Expires < @now
FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
END
CLOSE ExpiredSessionCursor
DEALLOCATE ExpiredSessionCursor
END
--EXPIRED SESSION LOGGING
/*
BEGIN TRY
INSERT INTO DeleteExpiredSessionLog(RunStart, RunEnd, ExpiredSessionsDeleted)
VALUES (@now, GETUTCDATE(), @ExpiredSessionCount);
END TRY
BEGIN CATCH
--SWALLOW ANY EXCEPTION
END CATCH;
*/
RETURN 0
- Tệp nhật ký được lấp đầy và trong một số trường hợp buộc tự động phát triển, mặc dù db đang trong quá trình khôi phục đơn giản
Ngoài ra, một dấu vết cho thấy nhiều yêu cầu cho cùng một phiên sắp diễn ra liên tiếp. Ví dụ: exec dbo.TempResetTimeout @id=N'32gghltsuoesnvlzbehchp2m2014c0f1'
14 lần trong <1 giây, vì vậy chúng tôi tự hỏi về điều này là nguyên nhân hoặc tắc nghẽn, nhưng không chắc chắn về gốc rễ của hành vi này.
Bất kỳ đề xuất hoặc giải thích xung quanh hành vi này sẽ được đánh giá cao.
SELECT 1; WHILE @@ROWCOUNT <> 0 BEGIN DELETE TOP (10) ... END