Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 回收SQL Server 2008中未使用的空间_Sql Server 2008_Administration - Fatal编程技术网

Sql server 2008 回收SQL Server 2008中未使用的空间

Sql server 2008 回收SQL Server 2008中未使用的空间,sql-server-2008,administration,Sql Server 2008,Administration,我有一个超过300000条记录的表,大小约为1.5 GB 在该表中,我有三个varchar(5000)字段,其余是小字段 在发布更新时,将这三个字段设置为' 收缩(数据库和文件)后,数据库使用的空间几乎与以前相同 DBCC SHRINKDATABASE(N'DataBase' ) DBCC SHRINKFILE (N'DataBase' , 1757) DBCC SHRINKFILE (N'DataBase_log' , 344) 关于如何回收磁盘空间有什么想法吗?我只需将这些字段设置为nul

我有一个超过300000条记录的表,大小约为1.5 GB

在该表中,我有三个
varchar(5000)
字段,其余是小字段

在发布
更新时,将这三个字段设置为
'

收缩(数据库和文件)后,数据库使用的空间几乎与以前相同

DBCC SHRINKDATABASE(N'DataBase' )
DBCC SHRINKFILE (N'DataBase' , 1757)
DBCC SHRINKFILE (N'DataBase_log' , 344)

关于如何回收磁盘空间有什么想法吗?

我只需将这些字段设置为null,发出收缩命令,然后将它们设置为“”

数据库从1.5GB增加到115MB

很奇怪

--


事实上,将这些字段设置为nullable(即重新创建整个表)确实起到了作用,因为将列设置为nil并不意味着数据库将重新对表进行排序。更新后的记录仍将放在以前放在的页面上(页面上的可用空间将增加)

另外,你知道,varchar(5000)并不意味着它占用5000个八位组,对吗?它是可变长度——一个两个八位字节长度的前缀,包含字段的数据长度,后跟数据八位字节。将行中的varchar(5000)列设置为“foobar”将需要8个八位字节的空间(2+6)

重新构建索引,包括聚类索引

如果没有聚类索引,请添加一个。这将强制重新调整表。现在删除集群索引

现在,当您收缩数据文件时,您应该回收一些磁盘空间。

基本上,您必须将表的内容从硬盘上的一个位置“移动”到另一个位置。当这样移动时,SQL将有效地“重新打包”页面的内容。仅将5000字节的数据替换为3(或0和翻转的空位掩码)不会导致SQL修改或重写表页的内容

如果表有聚集索引,只需对其重新索引(alterindex…REBUILD…)即可


如果表没有聚集索引,您可以创建一个聚集索引,然后将其删除,或者选择…放入。。。创建一个新表,删除旧表,然后将新表重命名为原始名称。

不确定这是否有任何区别,但您的表是堆还是有聚集索引?是的,我知道varchar是可变的。。。这就是为什么我认为清空varchar字段应该足以减少表的大小…是的,“移动内容”就是答案,更改聚集索引是一个很好的技巧,我确实更改了数据库的结构(sql manager创建了一个拖放并重新创建脚本…)