开发者社区> 科技小能手> 正文

DBCC SHRINKFILE 为什么会运行很长时间?

简介:
+关注继续查看

今天启用数据压缩功能后,数据库空出了很大的空间,然后使用DBCC SHRINKFILE收缩数据库,花费了很长的时间。相信很多使用SQL Server的朋友都遇到过这样的问题,为什么SQL Server收缩文件这么耗时?

 

MSDN上看到“DBCC SHRINKFILE is single-threaded and may take a long time tocomplete”(http://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx)也就是说SQL Server是单线程运行文件收缩,即使你有多个CPU性能也不会有帮助。

 

这里我做了一个测试,打开两个Query同时运行ShrinkFile命令,第二个语句会报错:

File ID 1 of database ID 17 cannot be shrunk as it is eitherbeing shrunk by another process or is empty.

DBCCexecution completed. If DBCC printed error messages, contact your systemadministrator.

 

文件收缩的三个步骤(可以从sys.dm_exec_request command栏位看到)

Step

Command

Description

1

DbccSpaceReclaim

Clean up deferred allocations and purge empty extents preparing for data moves.

2

DbccFilesCompact

Moves pages beyond the target to before the target and truncate file as required.

3

DbccLOBCompact

Compacting the LOB data.

 

SQL Server执行DBCC ShrinkFile以32个PAGE作为一个Transcation.当交易中被处理的PAGE移动到Targe空间后,这个Transcation被Commit然后开始一个新的Transcation。这样可以避免长时间的Transcation导致日志文件增长过大。当前Transcation被Rollback/cancel之后,Shrink操作只回滚当前的交易(最多32个Page)。这样如果在维护期间内不能够完成一次Shrink操作,可以分成多批次完成,每次处理一部分。

 

从网上找到了一篇如何快速收缩数据库文件的文章:

http://www.sqlservercentral.com/articles/SHRINKFILE/71414/

How It Works: SQL Server 2005 DBCC Shrink* May Take Longer Than SQL Server 2000:http://blogs.msdn.com/b/psssql/archive/2008/03/28/how-it-works-sql-server-2005-dbcc-shrink-may-take-longer-than-sql-server-2000.aspx


本文转自 lzf328 51CTO博客,原文链接:http://blog.51cto.com/lzf328/1110764

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
DBCC DROPCLEANBUFFERS失效了?
DBCC DROPCLEANBUFFERS是用来清除内存中的数据缓存,一般我们在做性能调优时为了方便看到一条语句的执行时间和物理IO消耗,都会在语句执行前执行一遍DBCC DROP CLEANBUFFERS。
1281 0
DBA工具——DMV——如何知道TSQL语句已运行了多久
原文: DBA工具——DMV——如何知道TSQL语句已运行了多久 DBA通常想知道正在运行的语句已经执行了多久了?可以使用Sqlserver profiler来捕获语句的开始时间,和现有时间比较,但是在生产环境下通常会对性能有负面影响,所以通常不建议在非必要的前提下在生产环境使用SQL Server Profiler。
691 0
第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2)
原文: 第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2) 承接上文,本文讲述如何使用系统存储过程来监控系统。
881 0
第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(3)
原文: 第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(3) 本文为这个系列最后一篇。将是如何使用DBCC命令来监控SQLServer日志空间的使用情况。
1071 0
通过DBCC整理Sqlserver数据库表索引碎片
昨天检查了一张效率极慢的表,两年多没有维护,逻辑扫描碎片高达99.81%,于是开始对这个表进行重点跟踪和记录日志。今天用DBCC SHOWCONTIG WITH TABLERESULTS 命令检查了一下所有表的概况,然后参照着MSDN对字段的说明,发现问题比较严重。
1089 0
对于超大型SQL SERVER数据库执行DBCC操作
原文: 对于超大型SQL SERVER数据库执行DBCC操作 对于数据库维护,主要使用DBCC CHECKDB来实现,以下是对大型数据库的使用说明,小型数据库一般直接使用就可以了: 1、2008(2005我不确认)已经实现了快照检查,也就是当你执行DBCC时,DBMS会先快照出一个数据库,然后在快照上执行检查,这样对原来的库不造成锁的影响。
596 0
MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间
原文:MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间 DBCC CHECKDB检查指定数据库中的所有对象的逻辑和物理完整性,具体请参考MSDN文档。我们必须定期对数据库做完整性检查(DBCC CHECKDB),以便能及时发现一些数据库损坏(Corruption)的情况。
876 0
+关注
科技小能手
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载