我有一个非常大的数据库,大部分空间是索引大小。我将几个索引移动到另一个文件组(仅用于实验),但无论我做什么,我都无法减小MDF的大小。
我尝试过收缩数据库,缩小文件,重建聚簇索引。我可以做些什么来回收MDF中的那个空间?我已将25GB的索引移动到另一个文件组。甚至可以用相同的25gb(或接近它)减少我的mdf?
SQL Server 2008 Enterprise
Group Total Space Avail Space
PRIMARY 388485.000000 27126.3125000
Index 24778.375000 26.6250000
我试图收缩的选项:
TSQL:
1. DBCC SHRINKFILE (1, 10);
2. DBCC SHRINKFILE (1, TRUNCATE_ONLY);
UI: Shrink database:
1. Without 'reorganize files...'
2. With 'reorganize files...'
2a. set max free space = 10%
2b. set max free space = 90%
2c. set max free space = 75%
UI: Shrink files: (type =data, group = primary, filename = db name)
1. Release unused space
2. reorganize pages... setting shrink file = 2GB (max it allows)
3. reorganize pages... setting shrink file = 361,360 (min allowed)
没有尝试'空文件'选项,因为这看起来不像我想要的。
答案 0 :(得分:1)
好的,在UI中尝试“收缩数据库”,最大可用空间为“0%”。
您在“工作”之前使用的10%设置,但您的27个演出可用空间低于您的总数据库的10%(相当于7%)。
请记住,这可能会导致您的性能问题,因为您的数据库需要再次增长,这也会导致性能问题,因为缩小会导致碎片化,这很糟糕。
但是,如果空间是您最关心的问题,则上述方法应工作。
答案 1 :(得分:1)
此步骤看起来不对
UI:缩小文件:( type = data,group = primary,filename = db name)
1.释放未使用的空间
2.重新组织页面...设置缩小文件= 2GB(最大允许)
3.重新组织页面...设置缩小文件= 361,360 (允许的最小值)
在您的问题步骤中,这是正确的步骤。
收缩文件以MB输入,因此值361,360将是太字节的三分之一。将其设置为最小的最简单方法是输入0,tab out - >它将取代允许的最小值。
现在我们需要将大小缩小到可管理的备份
这完全是错误的做法。 BACKUP 不包含可用空间,因此只要数据位于200GB(即备份文件的大小),主mdf文件是否具有100GB的可用空间或1TB。对于SQL Server 2008,您可以使用“with compression”,它的平均大小约为1/6。
答案 2 :(得分:1)
我在过去已经注意到,将数据文件缩小到较小的块可能比尝试一次性缩小数据文件更有效。如果您尝试使用类似的策略,那么您需要执行以下操作:
DECLARE @targetSize AS INT = 388000;
DECLARE @desiredFinalSize AS INT = 362000;
DECLARE @increment AS INT = 300;
DECLARE @sql AS VARCHAR(200);
WHILE @targetSize > @desiredFinalSize
BEGIN
SET @sql = 'DBCC SHRINKFILE(''MyDataFileName'', ' + CAST(@targetSize AS VARCHAR(10)) + ');'
SELECT @sql;
EXEC(@sql);
SET @targetSize = @targetSize - @increment;
END
答案 3 :(得分:0)
有时我注意到如果我缩小文件,它将不会缩小到低于文件上设置的初始大小。你能看看文件的初始文件大小是什么吗?