2017-10-18 26 views
0

私は、Cursorを使用してデータを一時テーブルに格納しているDeleteExpiredSessions(Microsooftが提供)のバージョンを持っています。 You can find it hereASP.NETセッション管理DeleteExpiredSessions愚かなようですか?

そしてこれは、それは単に、クエリの下に使用して期限切れのセッションを削除されていない理由を私は思ったんだけど、ストアドプロシージャ

CREATE PROCEDURE [dbo].[DeleteExpiredSessions] 
AS 
    SET NOCOUNT ON 
    SET DEADLOCK_PRIORITY LOW 

    DECLARE @now datetime 
    SET @now = GETUTCDATE() 

    CREATE TABLE #tblExpiredSessions 
    ( 
     SessionID nvarchar(88) NOT NULL PRIMARY KEY 
    ) 

    INSERT #tblExpiredSessions (SessionID) 
     SELECT SessionID 
     FROM dbo.ASPStateTempSessions WITH (READUNCOMMITTED) 
     WHERE Expires < @now 

    IF @@ROWCOUNT <> 0 
    BEGIN 
     DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY 
     FOR SELECT SessionID FROM #tblExpiredSessions 

     DECLARE @SessionID nvarchar(88) 

     OPEN ExpiredSessionCursor 

     FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       DELETE FROM dbo.ASPStateTempSessions WHERE SessionID = @SessionID AND Expires < @now 
       FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID 
      END 

     CLOSE ExpiredSessionCursor 

     DEALLOCATE ExpiredSessionCursor 

    END 

    DROP TABLE #tblExpiredSessions 

RETURN 0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

のソースコードです:

コードと思考を通じて探し
DELETE [ASPState].dbo.ASPStateTempSessions 
WHERE Expires < GETUTCDATE() 
+0

なぜこれが広すぎるのですか?この方法で実装された理由があるか、間違っているはずです。 – FLICKER

答えて

1

潜在的なDBの負荷とデータ量については、クリーンアップスクリプトがエスカレートしてアプリケーションを妨害する可能性のあるロックを引き起こさないようにするためだと思います。セッションテーブルは、すべてのWeb要求のクリティカルパス上にあります。

+0

意味があります。私は行の数が巨大なことを見落とし、それはテーブルロックを引き起こす可能性があります。もし私がより良いものを得なければ、あなたの答えを受け入れるでしょう。ありがとうございました! – FLICKER

関連する問題