حذف اطلاعات یک جدول با تعداد رکورد بالا با کمترین میزان Log در SqlServer
قطعا برای خیلی از برنامه نویس ها و یا ادمین های دیتابیس پیش آمده که می بایست تعداد خیلی زیادی از رکورد های یک جدول را حذف کند و تعدادی کمی از رکورد ها باقی بماند مثلا 2 میلیون رکورد یک جدول را حذف کرده و فقط 1000 رکورد باقی بماند ، خب در این وضعیت حذف عادی رکورد های این جدول باعث رشد خیلی زیاد لاگ دیتابیس می شود و در صورت کمبود فضا سیستم دچار مشکل می شود .خب در این حالت چاره چیست ؟
در این مقاله با ما همراه باشید تا این موضوع را بررسی کنیم .
سناریوی زیر را مرحله به مرحله انجام داده تا بیشتر با این مفهوم آشنا شوید .
- ساخت جدول تستی
--SQLDBA.IR
ALTER TABLE [dbo].[TestLog] (
id INT IDENTITY(1,1),
Date1 DATETIME DEFAULT GETDATE(),
Char1 NCHAR(20) DEFAULT 'My test desc!',
Rep NVARCHAR(MAX) DEFAULT REPLICATE('3213213213', 100)
);
GO
- بعد از ایجاد جدول مقداری رکورد تستی در جدول ایجاد می کنیم .
با اسکریپت زیر 1000 رکورد و 2 عدد ایندکس می سازیم .
--SQLDBA.IR
--Insert Data
SET NOCOUNT ON;
INSERT [dbo].[Testlog] (date1, char1 , rep)
VALUES (DEFAULT, 'This is A Test Log!', DEFAULT);
GO 10000
--SQLDBA.IR
SELECT top 10 * FROM [dbo].[Testlog];
SELECT COUNT(*) As 'Test1' FROM [dbo].[Testlog];
GO
--SQLDBA.IR
--CLUSTERED Index
CREATE CLUSTERED INDEX [ClusteredIndex_Testlog_date1] ON [dbo].[Testlog]
(date1 ASC)
GO
--NonCLUSTERED Index
CREATE UNIQUE NONCLUSTERED INDEX [NonClusteredIndex_Testlog_Col1_ID] ON [dbo].[Testlog]
([id] ASC)
GO
- ساخت یک جدول بدون دیتا از روی جدول اصلی
--SQLDBA.IR
create TABLE [dbo].[TestLog_Switch] (
id INT IDENTITY(1,1),
Date2 DATETIME DEFAULT GETDATE(),
Char2 NCHAR(20) DEFAULT 'My test desc!',
Rep2 NVARCHAR(MAX) DEFAULT REPLICATE('3213213213', 100)
);
GO
--SQLDBA.IR
CREATE CLUSTERED INDEX [ClusteredIndex_Test1_SWITCH_date2] ON [dbo].[Testlog_SWITCH]
([date2] ASC)
GO
--SQLDBA.IR
CREATE UNIQUE NONCLUSTERED INDEX [NonClusteredIndex_Test1_SWITCH_ID2] ON [dbo].[Testlog_SWITCH]
([id] ASC)
GO
- سوییچ کردن دو جدول با هم
با دستور Alter Table SWITCH میتوانیم دیتای جدول را با سرعت بسیار بالا به جدول جدید منتقل کنیم .
--SQLDBA.IR
ALTER TABLE [dbo].[Testlog] SWITCH to [dbo].[Testlog_SWITCH];
- انتقال رکورد های کمتری که مورد نظر ماست به جدول اصلی
--SQLDBA.IR
SET IDENTITY_INSERT [dbo].[Testlog] ON;
INSERT dbo.TestLog ( ID, Date1, Char1, Rep)
SELECT ID, Date2, Char2, Rep2 FROM [dbo].[Testlog_SWITCH] WHERE ID <= 1000;
SET IDENTITY_INSERT [dbo].[Testlog] OFF;
- حذف جدول Switch
و در انتها جدول Testlog_SWITCH که برای انتقال و نگهداری دیتای مورد نظر است:
--SQLDBA.IR
DROP TABLE [dbo].[Testlog_SWITCH];
بسیار عالی
سلام. حسین کامران هستم کارمند بانک کشاورزی
یک نرم افزار برای بخش بهداشت ودرمان بانک تولید کرده ام . در دیتا بیس با مشکل کندی اجرا مواجه شده ام. اگه امکانش باشه میخواستم ازتون کمک بگیرم. چطور میتونم باهاتون تماس بگیرم؟
سلام دوست عزیز
با شماره 09351710132 در چت تلگرام در خدمتتون هستم .