我有一个120GB大小的数据库。占用大量空间的表之一每天都会创建数千条记录。其中一列是nvarchar(max)
。此列通常可以包含2000个字符的数据,只需要在一周内存在。
如果我在这些记录一周后将该列更新为空白,则似乎不会减少数据库大小。 E.g:
UPDATE tblSample
SET largefieldname = ''
WHERE DateAdded < DATEADD(D, -7, GETDATE())
因此,如果我将100mb的数据插入该列,然后使用上述语句在一周后将该列空白,则数据库仍然保持100mb的大小。
在完成此类任务后,如何让数据库缩小?我不想删除整行,只需删除该特定列的不必要的磁盘使用情况。
答案 0 :(得分:2)
您需要考虑重新设计临时数据。 将临时数据放在自己的表中,并在主表中放置一个键。 完成数据后,删除键值并截断表。这不会释放未使用的空间,但会使维护更容易。回收可用磁盘空间的唯一方法是缩小数据库或使用分区。
答案 1 :(得分:0)
释放空间的一种方法是将表复制到临时文件中,截断表并从临时表中重新插入行。
试试这段代码:
create table dbo.x5 (name varchar(1000), i1 int IDENTITY(1,1))
set nocount on
-- select the next two rows and run
insert into dbo.x5 values (replicate('abcd',250))
go 10000
exec sp_spaceused 'dbo.x5' --11488 KB
update dbo.x5 set name=''
select * into #a1 from dbo.x5
truncate table dbo.x5
insert into dbo.x5 (name) select name from #a1
exec sp_spaceused 'dbo.x5' -- 136k
在具有多个索引的大型表上,可能需要删除索引,重新插入行并重新创建索引。您的结果会有所不同,因此请在安装时运行代码。
如果表上有聚簇索引,那么对索引进行重建也会释放空间。我不知道在堆上进行重建(没有聚簇索引的表)是否会产生相同的效果。
答案 2 :(得分:-1)
您可以通过以下方式将收缩过程应用于数据库:
USE [YourDatabase]
GO
DBCC SHRINKFILE (N'YourDatabase')
GO
这是SQL Server提供的命令,用于将该空间返回给操作系统,但请记住,不建议这样做,因为此过程会在索引上创建碎片,并且还会影响过程中的CPU成本,请采取看看下面的阅读http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/