Ale*_*ec. 3 sql-server sql-server-2008-r2 disk-space
我在 SQL Server 2008 R2 Express上运行一个相当大的数据库。最近我达到了 10GB 的限制,所以系统不允许我创建更多的对象,等等。
我已经归档了大量记录,大约是那里数据的四分之三。
数据库文件仍然在 10GB 左右,我想知道是否需要做任何事情来释放 SQL Server 中的可用空间。
如果您正在谈论文件系统空间并将其释放回操作系统,那么您将不得不手动执行此操作。
首先找出每个文件中有多少可用空间:
use YourDatabase;
go
;with file_cte as
(
select
name,
physical_name,
size_mb =
convert(decimal(11, 2), size * 8.0 / 1024),
space_used_mb =
convert(decimal(11, 2), fileproperty(name, 'spaceused') * 8.0 / 1024)
from sys.database_files
)
select
name,
physical_name,
size_mb,
space_used_mb,
free_space_mb = size_mb - space_used_mb,
space_used_percent =
convert(decimal(5, 2), space_used_mb / size_mb * 100)
from file_cte;
Run Code Online (Sandbox Code Playgroud)
然后,如果您绝对确定需要缩小数据库文件,则可以使用DBCC SHRINKFILE()。
要缩小文件,示例如下:
dbcc shrinkfile(YourDataFileName, <target_size_mb>);
Run Code Online (Sandbox Code Playgroud)
但是...只有在绝对必要的情况下才收缩您的数据库文件。如果您的文件将来要重新占用相同的空间,那么缩小文件是没有意义的。一个必要的阅读是为什么你不应该缩小你的数据文件 Paul Randal。
重建那里的表 - 这将使 SQL Server 重新组织所有内容,以最大化文件中可以重用的空间量。
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
ALTER INDEX ALL ON '
+ QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) + N'
REBUILD WITH
(
FILLFACTOR = 80,
STATISTICS_NORECOMPUTE = ON
);'
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
ON s.[schema_id] = t.[schema_id];
PRINT @sql;
-- EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
您可能需要查看其他REBUILD
选项,或者 - 如果您有具有不同填充因子的索引 - 使其动态化,以便它使用现有的填充因子重建每个索引。对脚本进行了许多潜在的更改,但这应该构成不必手动进行更改的基础。
没有理由缩小文件,因为这意味着当您开始添加更多数据时,它必须再次增长。当文件需要增长超过 10 GB 时,无论其同时增长多少次,您都将达到 Express 限制。这些帖子提供了一些关于为什么收缩是浪费的很好的信息,因为在大多数情况下,你只需要再次增长:
归档时间: |
|
查看次数: |
9399 次 |
最近记录: |