یادداشت های یک برنامه نویس
دوستدار فرهنگ و هنر کهن ایرانی

فرض کنیم دستور حذف به صورت زیر است:

DELETE
FROM dbo.MyTable
WHERE [Date] < '1404/04/04'

و با توجه به حجم بالای داده ها باعث قفل شدن پایگاه داده میشود، در این صورت کد را به صورت زیر اصلاح کنید و بجای 100 بزرگترین عددی را قرار دهید که در کمتر از یک ثانیه کوئری اجرا گردد:

DELETE TOP (100)
FROM dbo.MyTable
WHERE [Date] < '1404/04/04'

حالا به صورت زیر یک حلقه بنویسید که تا پایان یافتن داده‌ها ادامه یابد (هر موقع کوئری را متوقف کنید نیز تا جایی که حلقه پیش رفته داده‌ها پاک شده‌اند) :

WHILE 1 = 1
BEGIN
    DELETE TOP (100)
    FROM dbo.MyTable
    WHERE [Date] < '1404/04/04'

    IF @@ROWCOUNT = 0
        BREAK;

    WAITFOR DELAY '00:00:02'; -- وقفه 2 ثانیه
END

همچنین اگر روی شرط‌ها ایندکس ندارید، ایجاد آن باعث می‌شود شرط WHERE سریع‌تر عمل کند، می‌توانید آن را ایجاد و در صورتی که برای موارد دیگر به آن نیاز نیست در پایان کار آن را پاک کنید. به عنوان نمونه برای مثال بالا:

CREATE INDEX IX_MyTable_Date ON dbo.MyTable(Date);

 

دیدگاه ها: ارسال دیدگاه