সঙ্কুচিত ডাটাবেস সম্পর্কে আপনি সমস্ত সতর্কতা শুনেছেন এবং সেগুলি সত্য। এটি আপনার সূচিগুলিকে টুকরো টুকরো করবে এবং সাধারণভাবে, আপনার ডাটাবেসকে উপভোগ করবে এবং কোনও প্রোডাকশন সিস্টেমে করা উচিত নয়।
কিন্তু, আমি সাধারণত আমার সাপ্তাহিক ভিত্তিতে এটি করি যখন আমি আমার এসএসডি ড্রাইভে জায়গার কারণে আমার ওয়ার্কস্টেশনে একটি ব্যাকআপ পুনরুদ্ধার করি। মনে মনে, আমি এই স্ক্রিপ্টটি লিখিনি তবে কয়েক বছর আগে এটি খুঁজে পেয়েছি। অন্যান্য ডাটাবেসগুলিতে [250 গিগাবাইট], আমি একটি এসআইএসআই প্যাকেজ তৈরি করেছি যা আমার প্রয়োজনীয় টেবিলগুলি স্থানান্তর করবে এবং তারপরে ওহকে ততোধিক সূচী অনুভূতির জন্য সূচিগুলি পুনরায় তৈরি করবে।
DECLARE @DBFileName SYSNAME
DECLARE @TargetFreeMB INT
DECLARE @ShrinkIncrementMB INT
SET @DBFileName = 'Set Name of Database file to shrink'
-- Set Desired file free space in MB after shrink
SET @TargetFreeMB = 500
-- Set Increment to shrink file by in MB
SET @ShrinkIncrementMB = 100
SELECT [FileSizeMB] = convert(NUMERIC(10, 2),
round(a.size / 128., 2)),
[UsedSpaceMB] = convert(NUMERIC(10, 2),
round(fileproperty(a.NAME, 'SpaceUsed') / 128., 2)),
[UnusedSpaceMB] = convert(NUMERIC(10, 2),
round((a.size - fileproperty(a.NAME, 'SpaceUsed')) / 128., 2)),
[DBFileName] = a.NAME
FROM sysfiles a
DECLARE @sql VARCHAR(8000)
DECLARE @SizeMB INT
DECLARE @UsedMB INT
SELECT @SizeMB = size / 128.
FROM sysfiles
WHERE NAME = @DBFileName
SELECT @UsedMB = fileproperty(@DBFileName, 'SpaceUsed') / 128.
SELECT [StartFileSize] = @SizeMB
,[StartUsedSpace] = @UsedMB
,[DBFileName] = @DBFileName
WHILE @SizeMB > @UsedMB + @TargetFreeMB + @ShrinkIncrementMB
BEGIN
SET @sql = 'dbcc shrinkfile ( ' + @DBFileName + ', ' + convert(VARCHAR(20), @SizeMB - @ShrinkIncrementMB) + ' ) '
PRINT 'Start ' + @sql
PRINT 'at ' + convert(VARCHAR(30), getdate(), 121)
EXEC (@sql)
PRINT 'Done ' + @sql
PRINT 'at ' + convert(VARCHAR(30), getdate(), 121)
SELECT @SizeMB = size / 128.
FROM sysfiles
WHERE NAME = @DBFileName
SELECT @UsedMB = fileproperty(@DBFileName, 'SpaceUsed') / 128.
SELECT [FileSize] = @SizeMB
,[UsedSpace] = @UsedMB
,[DBFileName] = @DBFileName
END
SELECT [EndFileSize] = @SizeMB
,[EndUsedSpace] = @UsedMB
,[DBFileName] = @DBFileName
SELECT [FileSizeMB] = convert(NUMERIC(10, 2), round(a.size / 128., 2))
,[UsedSpaceMB] = convert(NUMERIC(10, 2), round(fileproperty a.NAME, 'SpaceUsed') / 128., 2))
,[UnusedSpaceMB] = convert(NUMERIC(10, 2), round((a.size - fileproperty(a.NAME, 'SpaceUsed')) / 128., 2))
,[DBFileName] = a.NAME
FROM sysfiles a