سلام دوستان.
🔧 بهینهسازی حذف 17 میلیون رکورد در SQL Server 🚀
قرار بود از یک جدول، حدود 17 میلیون رکورد حذف بشه.
منطق اولیه به این صورت بود که:
🔹 داخل یک حلقه، با یک SELECT
🔹 هر بار 20,000 رکورد در یک Local Variable ریخته میشد
🔹 و سپس عملیات حذف انجام میگرفت
⏳ این روش بهشدت کند بود و فرآیند حذف چندین ساعت زمان میبرد.
💡 راهکاری که پیادهسازی کردم:
✅ منطق را بهطور کامل بازطراحی کردم:
1️⃣ دستور SELECT را از داخل حلقه خارج کردم
2️⃣ یک Temporary Table ساختم
3️⃣ تمام IDهای موردنظر را یکجا داخل آن INSERT کردم
4️⃣ روی جدول Temp یک Index مناسب ایجاد کردم ⚡️
5️⃣ در حلقه، هر بار فقط 20,000 رکورد:
از جداول اصلی حذف میشد و همان 20,000 رکورد از جدول Temp هم پاک میشد
🔁 کل فرآیند در قالب یک Transaction کنترلشده انجام شد
📌 بهطوری که بعد از هر 20,000 رکورد COMMIT میشد تا:
رشد Transaction Log کنترل بشه.
با توجه به Auto Backupهای مداوم، فایل لاگ من رشد نمیکرد که باعث ترکیدن سیستم بشه.
🎯 نتیجه نهایی:
🔥 حذف کامل 17,000,000 رکورد فقط در 56 دقیقه
📉 کاهش چشمگیر زمان اجرا
📉 کنترل مصرف لاگ
📈 افزایش پایداری سیستم در زمان عملیات
⚠️ نکته مهم درباره علت کندی اولیه:
روی جدول، Cascade Delete فعال بود
و به دلیل محدودیتهای سیستمی امکان تغییر آن وجود نداشت
بنابراین بهینهسازی باید کاملاً در سطح منطق اجرا و معماری حذف داده انجام میشد، نه ساختار دیتابیس.
25
8
5
2
1December 14, 2025 2.3K 18 24