DBCC SHRINKFILE 为什么会运行很脚本长时间运行怎么办

您所在的位置: &
为什么DBCC SHRINKFILE会不起作用(1)
为什么DBCC SHRINKFILE会不起作用(1)
电子工业出版社
《Microsoft SQL Server企业级平台管理实践》要面向Microsoft SQL Server各个版本的数据库系统管理和开发人员,介绍SQL Server关系型数据库引擎在日常使用和开发过程中经常会遇到的问题、其表现形式等,第1章讲述数据库空间管理。本节说的是为什么DBCC SHRINKFILE会不起作用。
1.2.4& 为什么DBCC SHRINKFILE会不起作用
数据库管理员为了控制文件的大小,可能有时候要收缩文件,或者要把某些数据文件清空以便从数据库里删除。这时有两个命令可供选择:DBCC&SHRINKDATABASE& &(&'database&name'&|&database&id&|&0& &&&&&&[&,target&percent&]& &&&&&&[&,&{&NOTRUNCATE&|&TRUNCATEONLY&}&]&) &[&WITH&NO&INFOMSGS&] &&&DBCC&SHRINKFILE&& &(&&&&&&{&'file&name'&|&file&id&}&&&&&& &{&[&,&EMPTYFILE&]&&&&&&|&[&[&,&target&size&]&[& &,&{&NOTRUNCATE&|&TRUNCATEONLY&}&]&]&&&&&} &&)&[&WITH&NO&INFOMSGS&]&
-- 收缩当前数据库指定数据文件或日志文件的大小,
-- 或者通过将数据从指定的文件移动到相同文件组中的其他文件来清空文件,以允许从数据库中删除该文件。
由于DBCC SHRINKDATABASE一次运行会同时影响所有的文件(包括数据文件和日志文件),使用者不能指定每个文件的目标大小,其结果可能不能达到预期的要求。所以建议还是先做好规划,对每个文件确定预期目标,然后使用DBCC SHRINKFILE来一个文件一个文件地做比较稳妥。
计划收缩数据文件时,要考虑到以下几点:
1.&首先要了解数据文件当前的使用情况。
收缩量的大小不可能超过当前文件的空闲空间的大小。如果想要压缩数据库的大小,首先就要确认数据文件里的确有相应未被使用的空间。如果空间都在使用中,那就要先确认大量占用空间的对象(表格或索引)。然后通过归档历史数据,先把空间释放出来。
2.&主数据文件(Primary File)是不能被清空的。能被完全清空的只有辅助数据文件。
3.&如果要把一个文件组整个清空,要删除分配在这个文件组上的对象(表格或索引),或者把它们移到其他文件组上。DBCC SHRINKFILE不会帮你做这个工作。
把数据文件里面该清除的数据和对象清除完、确认数据文件(组)有足够的空闲空间后,管理员就可以下DBCC SHRINKFILE命令来缩小或清空指定文件了。如果是要缩小文件,就填上需要的tearget_size,如果是要清空文件,就选择EMPTYFILE。SQL Server在做DBCC SHRINKFILE的时候,会扫描数据文件并对正在读的页面加锁,所以对数据库的性能会有所影响。但是这不是一个独占的行为。在做SHINKFILE的时候,其他用户照样可以对数据库进行读写操作。所以不需要安排专门的服务器停机时间来做,一般在数据库维护的时段就可以进行。可以在进程中的任一点停止DBCC SHRINKFILE操作,任何已完成的工作都将保留。如果操作没有在规定的时间内完成,也可以安全地停止它。
可是,有时候明明看到数据文件里有空间,为什么就是不能压缩或者清空它呢?这通常是因为数据文件里面虽然有很多空的页面,但是这些页面分散在各个区里,使得整个文件没有很多空的区。
需要说明的是,DBCC SHRINKFILE做的,都是区一级的动作。它会把使用过的区前移,把没在使用中的区从文件中移除。但是,它不会把一个区里面的空页移除、合并区,也不会把页面里的空间移除、合并页面。所以,一个数据库中有很多只使用了一两个页面的区,DBCC SHRINKFILE的效果会不明显。
下面来举一个例子。先创建一个空数据库,创建一个每一行都会占用一个页面的表格。表格上没有聚集索引,所以是一个堆。往里面插入8 000条数据。create&database&test_shrink &go &use&test_shrink &go &create&table&show_extent &(a&int, &b&nvarchar(3900)) &go &declare&@i&int&set&@i&=&1 &while&@i&&=1000 &begin&insert&into&show_extent&values&(1,&REPLICATE&(&N'a'&,3900&)) &insert&into&show_extent&values&(2,&REPLICATE&(&N'b'&,3900&)) &insert&into&show_extent&values&(3,&REPLICATE&(&N'c'&,3900&)) &insert&into&show_extent&values&(4,&REPLICATE&(&N'd'&,3900&)) &insert&into&show_extent&values&(5,&REPLICATE&(&N'e'&,3900&)) &insert&into&show_extent&values&(6,&REPLICATE&(&N'f'&,3900&)) &insert&into&show_extent&values&(7,&REPLICATE&(&N'g'&,3900&)) &insert&into&show_extent&values&(8,&REPLICATE&(&N'h'&,3900&)) &set&@i&=&@i&+1 &end&dbcc&showcontig('show_extent') &go &可以看到它申请了8&000页。 &DBCC&SHOWCONTIG&scanning&'show&extent'&table... &Table:&'show&extent'&();&index&ID:&0,&database&ID:&5 &TABLE&level&scan&performed. &-&Pages&Scanned................................:&8000 &-&Extents&Scanned..............................:&1004 &-&Extent&Switches..............................:&1003 &-&Avg.&Pages&per&Extent........................:&8.0 &-&Scan&Density&[Best&Count:Actual&Count].......:&99.60%&[] &-&Extent&Scan&Fragmentation&...................:&4.88% &-&Avg.&Bytes&Free&per&Page.....................:&279.0 &-&Avg.&Page&Density&(full).....................:&96.55%&
现在我们删除每个区里面的7个页面,只保留a=5的这些记录。delete&show&extent&where&a&&&5 &go &sp&spaceused&show&extent &go &dbcc&showcontig('show&extent') &go&
出乎我们意料的是,这个表格里现在还有一半的页面在使用(参见上一节的讨论),没有一个区被释放。name&&&&&&&&&&&&&rows&&&&reserved&&&&&data&&&&&&&&&&index&size&&&&&unused &&&show&extent&&&&&1000&&&&64072&KB&&&&&32992&KB&&&&&8&KB&&&&&&&&&&& &31072&KB &&DBCC&SHOWCONTIG&scanning&'show&extent'&table... &Table:&'show&extent'&();&index&ID:&0,&database&ID: &5 &TABLE&level&scan&performed. &-&Pages&Scanned................................:&4124 &-&Extents&Scanned..............................:&1004 &-&Extent&Switches..............................:&1003 &-&Avg.&Pages&per&Extent........................:&4.1 &-&Scan&Density&[Best&Count:Actual&Count].......:&51.39% &[516:1004] &-&Extent&Scan&Fragmentation&...................:&4.88% &-&Avg.&Bytes&Free&per&Page.....................:&6199.0 &-&Avg.&Page&Density&(full).....................:&23.41% &&database&name&&&&&database&size&&&&&unallocated&space&&test&shrink&&&&&&&187.13&MB&&&&&&&&&&0.56&MB &&reserved&&&&&&&&&&&data&&&&&&&&&&&&&&&index&size&&&&&&&& &unused &&&65152&KB&&&&&&&&&&&33464&KB&&&&&&&&&&&576&KB&&&&&&&&&&&& &31112&KB&
【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
本书由麦思博(北京)软件技术有限公司主编,由著名Oracle专家和
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 10人学习过讲师: 8人学习过讲师: 14人学习过
本书是一本全面的C++教程,介绍C++编程知识及问题解决
本书主要阐述了云计算中PaaS 平台的实现与运维管理,
这既是古典媒体的大裂变年代,也是在线媒体开启的新闻
本书讲述怎样把UNIX环境下的应用程序移植到Linux环境上运行,是一本综合的开发和解决问题的参考手册 。本书详细描述了当前IT行业
51CTO旗下网站java循环越跑越慢为什么?高手进_百度知道dbcc shrinkdatabase 一般要多久啊
[问题点数:100分]
dbcc shrinkdatabase 一般要多久啊
[问题点数:100分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年12月 总版技术专家分月排行榜第三2011年9月 总版技术专家分月排行榜第三
2011年6月 MS-SQL Server大版内专家分月排行榜第一
2011年12月 总版技术专家分月排行榜第三2011年9月 总版技术专家分月排行榜第三
2011年6月 MS-SQL Server大版内专家分月排行榜第一
2011年8月 总版技术专家分月排行榜第二2011年7月 总版技术专家分月排行榜第二
2012年7月 荣获微软MVP称号
2011年 总版技术专家分年内排行榜第四2010年 总版技术专家分年内排行榜第九2009年 总版技术专家分年内排行榜第八
2011年10月 总版技术专家分月排行榜第一
2011年 总版技术专家分年内排行榜第四2010年 总版技术专家分年内排行榜第九2009年 总版技术专家分年内排行榜第八
2011年10月 总版技术专家分月排行榜第一
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 shrinkfile执行速度 的文章

 

随机推荐