包含LOB_Data列的表删除大量数据后表及数据库文件的收缩

最近有一张表(内含varchar(max)字段),占用空间达到240G,删除历史数据后几十万条后,空间并未得到释放。

然后用DBCC CLEANTABLE(0,tb_name,100)来释放删除记录后变长字段留下的空间,注意第三个参数为每个事务处理的行数,

强烈建议使用,默认是0,将整个操作作为一个事务处理!全程锁表!!

执行完DBCC CLEANTABLE后,发现表空间已经释放,占用空间几百兆,但此时还没完,我们数据库文件依然很大。

于是我们尝试用DBCC SHRINKFILE来收缩库文件,结果却出人意料,文件并没有收缩到我们预想的大小,而是远远大于所有表

的大小之和,100G之多,为什么?

我们通过DBCC SHOWFILESTATUS命令查看分区状态,发现有大量的未使用分区,于是开始怀疑是区内页填充密度过低导致的,

每个区8个页,如果有一个页不为空,SHRINKFILE命令也不会收缩该分区,因为SHRINKFILE命令是以区为单位的,它只会收缩掉

完全空的分区。

所以下面我们来看一下“肇事”表的填充密度到底如何,这里我们使用DBCC SHOWCONFIG(‘TB’)命令:

可以看到,虽然这张表的区的利用率比较低,为25.76%[34:132],即本来用34个分区就可以容纳的数据,它用了132个分区来容纳,

但是远远不可能造成上面199万个区的空间耗费!这到底是怎么回事!!

没错,bug再一次显了神威!相关KB:http://support.microsoft.com/kb/2967240/en-us

那么还有没有其它方法呢?答案是肯定的,那就是重建该对象:

方法1:重新一张结构一样的表,将原表数据导入新表,干掉原表,重命名新表;

方法2:将现有数据导出,TRUNCATE表,然后再将数据导回;

另外,经过测试,上面KB中提出的CU13 FOR SQL SERVER 2008 R2 SP2,安装之后并不能使DBCC SHRINKFILE生效,故应该为避免以上情景的出现!

时间: 2024-11-08 15:52:19

包含LOB_Data列的表删除大量数据后表及数据库文件的收缩的相关文章

查看hive中某个表中的数据、表结构及所在路径

查看hive中action_data_myisam表中的数据.表结构及所在路径 1.客户端进入hive环境:hive 2.查看表数据,鉴于数据量大,这里只显示前五条:select * from action_data_myisam limit 5; 3.查看表结构:desc action_data_myisam; 4.查看此表所在路径:describe extended action_data_myisam; 图1针对1.2.3步 图2 针对第4步 end!

表A的数据减去表B ,最终得到表C

==========表A数据如下:                 表B数据如下:cr     zc     lx                     cr    zc    lx100   100   1                     50    50   190     80    2                     10    20   370      80   3我想要以下的结果:表C:cr     zc      lx50    50      190    

案例:Oracle数据库文件删除 extundelete工具挖掘恢复删除的数据库文件

Oracle数据库文件被删除,通过extundelete恢复Linux被删除数据文件 今天群中有个朋友的客户闲着没事rm掉了数据文件,然后讨论到使用extundelete进行了恢复,抢救了部分未被覆盖的数据文件.该软件官方地址:http://extundelete.sourceforge.net/ 1.安装extundelete工具 [[email protected] tmp]# bunzip2 extundelete-0.2.0.tar.bz2 [[email protected] tmp]

delete表1条件是另一个表中的数据,多表连接删除(转)

DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释:1. delete from t1 where 条件2.delete t1 from t1 where 条件3. delete t1 from t1,t2 where 条件4.delete t1,t2 from t1,t2 where 条件前 3者是可行的,第4者不可行.也就是简单用delete语句无法进行多表删除数据操作,不过可以建立级联删除,在两个表之间建立级联删除关系,则可以实现删除一个表的数据时,同时删除另

怎么快速删除大数据量表

v一.前言 要清空表中数据,100w条数据以上的表,开始我们使用delete from t_user进行删除,这样操作太慢了,需要等好长时间,如果数据量更大,那么我们要等的时间无法想象. 可以用以下方法进行删除 假设要删除的原表为SOURCE_T v二.解决办法 第一步:生成中间表 1 create table SOURCE_T_M as select * from SOURCE_T where id = '111' --任意指定一条符合条件的数据即可 第二步:修改表名 1 rename SOU

C# 将DataTable表中的数据批量插入到数据库表中的方法

C#中有时候需要将内存中的数据批量插入到数据库表中,使用for循环进行批量插入不但耗时而且会频繁操作数据库. 针对数据量很少的可以使用for循环插入,但是针对于数据量大的则不推荐使用for循环插入,推荐使用sql的块处理插入. 块处理不但耗时少而且不会频繁对数据库进行操作,只是需要注意的一点是DataTable中的列必须与表的列完全一致. 如下代码是批量插入的一个函数,自测可用. 1 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 2 /// <summa

EMC Isilon(OneFS)删除重要数据后恢复案例

[故障描述]某大学因黑客入侵,导致其"教学系统"的重要数据被删除.其中包括"教学系统"中的MSSQL数据库,以及大量的MP4.ASF和TS类型的视频教学文件.整体存储架构采用EMC高端网络NAS(Isilon S200),节点数量为3个,每个节点配置12块3T STAT硬盘,无SSD.所有数据一共分两部分,一部分数据为vmware虚拟机(WEB服务器),通过NFS协议共享到ESX主机,另一部分数据为视频教学文件,通过CIFS协议共享给虚拟机(WEB服务器).黑客只删

Python脚本---把MySQL数据库表中的数据导出生成csv格式文件

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/45841221 #!/usr/bin/env python # -*- coding:utf-8 -*- """  Purpose: 生成日汇总对账文件  Created: 2015/4/27  Modified:2015/5/1  @author: guoyJoe""" #导入模块import MySQLdbimport timeimpo

【数据库】 关联多表删除重复数据

delete table from table a, ( select b.val1 ,b.val2 ,COUNT(1) as cnt from table b group by b.val1 ,b.val2 haval1g COUNT(1) > 1 )b where a.val1 = b.val1 and a.val2 = b.val2 and a.id not in ( select MAX(id) as id from table a group by val1 ,val2 haval1g