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

حذف داده‌ حجیم از جدول در SQL Server


پرسش امنیتی

مقدار 18 به علاوه 10 چقدر میشود؟

دیدگاه شما پس از تایید نمایش داده خواهد شد.

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

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);