SQL Server空表依然占用空间
目录
最近查看表空间占用情况时,发现有个表行数为0,但占用空间依然非常高,对database进行Shrink也不会释放,百思不得其解,后面查资料发现堆表(Heap)可能会出现这样情况。对堆表而言,Delete时获取表级别的锁时才会释放空间。
解决方案
为了避免这种情况发现,可以用如下方法:
- Truncate Table
TRUNCATE TABLE <Table_Name>
如果要删除所有数据,可直接Truncate
- Delete时加上TABLOCK选项
DELETE FROM <Table_Name> WITH(TABLOCK) WHERE <Condition>
用此选项时,Delete的数据会同时被释放。注意:若本身为空表且尚有空间占用,此方法不适用。
- Rebuild Table
ALTER TABLE <Table_Name> REBUILD
- 为表创建聚集索引
小结
如果一个表没有聚集索引,那它就是一个Heap,Heap除了Insert Into和Select Into时速度快一点之外,几乎没有别的好处,所以尽量对所有表特别是大表建一个聚集索引,可以避免很多问题。