mssql 2000 系统表的系统磁盘碎片整理理

Oracle表碎片整理操作步骤详解
字体:[ ] 类型:转载 时间:
数据库在日常使用过程中,不断的insert,delete,update操作,导致表和索引出现碎片是在所难免的事情,碎片多了,sql的执行效率自然就差了,下面看看如何表碎片整理,提高执行效率
高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink space碎片整理功能。对于索引,可以采取rebuild online的方式进行碎片整理,一般来说,经常进行DML操作的对象DBA要定期进行维护,同时注意要及时更新统计信息!一:准备测试数据,使用HR用户,创建T1表,插入约30W的数据,并根据object_id创建普通索引,表占存储空间34M
代码如下:SQL& conn /as sysdba 已连接。 SQL& select default_tablespace from dba_users where username='HR'; DEFAULT_TABLESPACE ------------------------------------------------------------ USERS SQL& conn hr/hr 已连接。 SQL& insert into t1 select * from t1; 已创建 74812 行。 SQL& insert into t1 select * from t1; 已创建 149624 行。 SQL& 提交完成。 SQL& create index idx_t1_id on t1(object_id); 索引已创建。 SQL& exec dbms_stats.gather_table_stats('HR','T1',CASCADE=&TRUE); PL/SQL 过程已成功完成。 SQL& select count(1) from t1; & COUNT(1) ---------- &&& 299248 SQL& select sum(bytes)/ from dba_segments where segment_name='T1'; SUM(BYTES)/ -------------------- &&&&&&&&&&&& 34.0625 SQL& select sum(bytes)/ from dba_segments where segment_name='IDX_T1_ID'; SUM(BYTES)/ -------------------- &&&&&&&&&&&&&&&&&& 6
二:估算表在高水位线下还有多少空间可用,这个值应当越低越好,表使用率越接近高水位线,全表扫描所做的无用功也就越少!DBMS_STATS包无法获取EMPTY_BLOCKS统计信息,所以需要用analyze命令再收集一次统计信息
代码如下:SQL& SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1'; &&& BLOCKS EMPTY_BLOCKS&& NUM_ROWS ---------- ------------ ---------- &&&&& 4302&&&&&&&&&&& 0&&&& 299248 SQL& analyze table t1 表已分析。 SQL& SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1'; &&& BLOCKS EMPTY_BLOCKS&& NUM_ROWS ---------- ------------ ---------- &&&&& 4302&&&&&&&&&& 50&&&& 299248 SQL& col table_name for a20 SQL& SELECT TABLE_NAME, & 2&&&&&&&& (BLOCKS * 8192 / 1024 / 1024) - & 3&&&&&&&& (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB" & 4&&& FROM USER_TABLES & 5&& WHERE table_name = 'T1'; TABLE_NAME&&&&&&&&&& Data lower than HWM in MB -------------------- ------------------------- T1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 5.
三: 查看执行计划,全表扫描大概需要消耗CPU 1175
代码如下:SQL& explain plan for select * from t1; 已解释。 SQL& select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value:
-------------------------------------------------------------------------- | Id& | Operation&&&&&&&& | Name | Rows& | Bytes | Cost (%CPU)| Time&&&& | -------------------------------------------------------------------------- |&& 0 | SELECT STATEMENT& |&&&&& |&& 299K|&&& 28M|& 1175&& (1)| 00:00:15 | |&& 1 |& TABLE ACCESS FULL| T1&& |&& 299K|&&& 28M|& 1175&& (1)| 00:00:15 | --------------------------------------------------------------------------
四:删除大部分数据,收集统计信息,全表扫描依然需要消耗CPU 1168
代码如下:SQL& delete from t1 where object_id&100; 已删除298852行。 SQL& 提交完成。 SQL& select count(*) from t1; & COUNT(*) ---------- &&&&&& 396 SQL&& exec dbms_stats.gather_table_stats('HR','T1',CASCADE=&TRUE); PL/SQL 过程已成功完成。 SQL& analyze table t1 表已分析。 SQL& SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name ='T1'; &&& BLOCKS EMPTY_BLOCKS&& NUM_ROWS ---------- ------------ ---------- &&&&& 4302&&&&&&&&&& 50&&&&&&& 396 &SQL& explain plan for select * from t1; 已解释。 SQL& select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------ Plan hash value:
-------------------------------------------------------------------------- | Id& | Operation&&&&&&&& | Name | Rows& | Bytes | Cost (%CPU)| Time&&&& | -------------------------------------------------------------------------- |&& 0 | SELECT STATEMENT& |&&&&& |&& 396 | 29700 |& 1168&& (1)| 00:00:15 | |&& 1 |& TABLE ACCESS FULL| T1&& |&& 396 | 29700 |& 1168&& (1)| 00:00:15 | --------------------------------------------------------------------------
五:估算表在高水位线下还有多少空间是无数据的,但在全表扫描时又需要做无用功的数据
代码如下:SQL& SELECT TABLE_NAME, & 2&&&&&&&& (BLOCKS * 8192 / 1024 / 1024) - & 3&&&&&&&& (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB" & 4&&& FROM USER_TABLES & 5&& WHERE table_name = 'T1'; TABLE_NAME&&&&&&&&&& Data lower than HWM in MB -------------------- ------------------------- T1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 33.5791626
六:对表进行碎片整理,重新收集统计信息
代码如下:SQL& alter table t1 表已更改。 SQL& alter table t1
表已更改。 SQL& select sum(bytes)/ from dba_segments where segment_name='T1'; SUM(BYTES)/ -------------------- &&&&&&&&&&&&&&& .125 SQL& select sum(bytes)/ from dba_segments where segment_name='IDX_T1_ID '; SUM(BYTES)/ -------------------- &&&&&&&&&&&&&& .0625 SQL& SELECT TABLE_NAME, & 2&&&&&&&& (BLOCKS * 8192 / 1024 / 1024) - & 3&&&&&&&& (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB" & 4&&& FROM USER_TABLES & 5&& WHERE table_name = 'T1'; TABLE_NAME&&&&&&&&&& Data lower than HWM in MB -------------------- ------------------------- T1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 33.5791626 SQL& exec dbms_stats.gather_table_stats('HR','T1',CASCADE=&TRUE); PL/SQL 过程已成功完成。 这个时候,只剩下0.1M的无用功了,执行计划中,全表扫描也只需要消耗CPU 3 SQL& SELECT TABLE_NAME, & 2&&&&&&&& (BLOCKS * 8192 / 1024 / 1024) - & 3&&&&&&&& (NUM_ROWS * AVG_ROW_LEN / 1024 / 1024) "Data lower than HWM in MB" & 4&&& FROM USER_TABLES & 5&& WHERE table_name = 'T1'; TABLE_NAME&&&&&&&&&& Data lower than HWM in MB -------------------- ------------------------- T1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . &SQL& select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value:
-------------------------------------------------------------------------- | Id& | Operation&&&&&&&& | Name | Rows& | Bytes | Cost (%CPU)| Time&&&& | -------------------------------------------------------------------------- |&& 0 | SELECT STATEMENT& |&&&&& |&& 396 | 29700 |&&&& 3&& (0)| 00:00:01 | |&& 1 |& TABLE ACCESS FULL| T1&& |&& 396 | 29700 |&&&& 3&& (0)| 00:00:01 | -------------------------------------------------------------------------- 总共只有5个块,空块却有50个,明显empty_blocks信息过期 SQL& select blocks,empty_blocks,num_rows from user_tables where table_name='T1'; &&& BLOCKS EMPTY_BLOCKS&& NUM_ROWS ---------- ------------ ---------- &&&&&&&& 5&&&&&&&&&& 50&&&&&&& 396 SQL& analyze table t1 表已分析。 SQL& select blocks,empty_blocks,num_rows from user_tables where table_name='T1'; &&&& BLOCKS EMPTY_BLOCKS&& NUM_ROWS ---------- ------------ ---------- &&&&&&&& 5&&&&&&&&&&& 3&&&&&&& 396
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
之后通过较长时间的使用后(大概一年的时间),发现速度明显慢这期间内一直有速度慢的现象.下面是试图解决该问题的步骤:1.在企业管理器中数据库右键弹出的属性中在"选项"标签页将兼容级别从80修改到90如下图:&2.对索引进行碎片整理或者重建索引& &下面文章来自网络:===================================================================================索引对数据库的影响是显而易见的,这里就不多说了。本文是索引碎片整理和索引重建对数据查询和空间占用的一个实验,和大家一起学习。希望高手多多指点。&首先介绍一下索引碎片整理和索引重建的区别:&&&&& 与 DBCC DBREINDEX 或任何常规索引生成不同,DBCC INDEXDEFRAG 是一个联机操作,因此它不控制长期锁,该锁会阻塞查询或更新的运行。根据碎片的量,DBCC INDEXDEFRAG 可以比运行 DBCC DBREINDEX 快得多,因为对碎片相对较少的索引进行碎片整理会比生成新索引快得多。另一个优点是,与 DBREINDEX 不同,使用 DBCC INDEXDEFRAG 时索引始终可用。大量的碎片可以导致 DBCC INDEXDEFRAG 运行的时间比 DBCC DBREINDEX 长得多,这一点可能会也可能不会胜过该命令的联机功能所带来的优势。如果两个索引在磁盘上交叉存取事务,DBCC INDEXDEFRAG 将没有作用,原因是 INDEXDEFRAG 打乱了已有的页。若要改善页的聚集,请重建索引。&【个人建议】如果需要整理索引的表可以脱机的话,使用重建索引;不能脱机的话,采用碎片整理。&【实验过程】:--.查看表的索引(使用sp_helpindex)指令:sp_helpindex 'tablename'结果:id clustered located on PRIMARY src_addrix_createtime nonclustered located on PRIMARY createtime【结果】该表有一个聚集索引‘id’和一个非聚集索引‘ix_createtime’&--查看数据和索引的碎片信息(使用DBCC SHOWCONTIG)指令:DBCC SHOWCONTIG (tablename)结果:DBCC SHOWCONTIG 正在扫描 'tablename' 表...表: 'tablename'();索引 ID: 1,数据库 ID: 7已执行 TABLE 级别的扫描。- 扫描页数.....................................: 50084- 扫描扩展盘区数...............................: 6308- 扩展盘区开关数...............................: 50072- 每个扩展盘区上的平均页数.....................: 7.9- 扫描密度[最佳值:实际值]....................: 12.50%[]&& --小于 100,则存在碎片。12.50%说明有很多碎片- 逻辑扫描碎片.................................: 50.40% --0是最好- 扩展盘区扫描碎片.............................: 52.31%- 每页上的平均可用字节数.......................: 2728.0- 平均页密度(完整)...........................: 66.30% --100%是最好--整理索引碎片(使用DBCC INDEXDEFRAG)DBCC INDEXDEFRAG (0,tablename,id)DBCC INDEXDEFRAG (0,tablename,ix_createtime)&--重建索引(使用DBCC DBREINDEX)DBCC DBREINDEX(tablename,'',0)&--重建索引后查看碎片DBCC SHOWCONTIG (tablename)DBCC SHOWCONTIG 正在扫描 'tablename' 表...表: 'tablename'();索引 ID: 1,数据库 ID: 7已执行 TABLE 级别的扫描。- 扫描页数.....................................: 36482- 扫描扩展盘区数...............................: 4578- 扩展盘区开关数...............................: 4577- 每个扩展盘区上的平均页数.....................: 8.0- 扫描密度[最佳值:实际值]....................: 99.63%[]- 逻辑扫描碎片.................................: 0.00%- 扩展盘区扫描碎片.............................: 19.94%- 每页上的平均可用字节数.......................: 726.6- 平均页密度(完整)...........................: 91.02%DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。&--碎片整理对表空间的影响(使用sp_spaceused)sp_spaceused tablenametablename 1614319&&&& 485360 KB 400672 KB 83216 KB 1472 KBtablename 1614319&&&& 485392 KB 400672 KB 59008 KB 25712 KB --整理非聚集索引的碎片后tablename 1614319&&&& 485424 KB 299512 KB 59008 KB 126904 KB --整理聚集索引的碎片后tablename 1614938&&&& 348736 KB 291856 KB 56832 KB 48 KB --重建索引后【结论】1.非聚集索引碎片占用的是索引页空间,聚集索引碎片占用的是数据页空间,重建索引后释放出空间。2.碎片整理可以清理出比较多的空间。3.重建索引后效率提升相当明显。------下边是整理某个数据库的所有索引碎片的脚本(该脚本来自网络)------set&& nocount&& on&&&& declare&& @s_table&& varchar(50),@s_index&& varchar(50)&&&& create&& table&& #test(&&&& index_name&& varchar(100),&&&& index_description&& varchar(500),&&&& index_keys&& varchar(500)&&&& )&&&& insert&& into&& #test&&&& exec&& sp_msforeachtable&& 'sp_helpindex&& ''?'''&&&& declare&& c_index&& cursor&& for&&&& select&& index_name&& from&& #test&&&& open&& c_index&&&& fetch&& next&& from&& c_index&& into&& @s_index&&&& while(@@fetch_status&& =&& 0)&&&&&&&& begin&&&&&&&&&&&& select&& @s_table&& =&& b.name&&&&&&&&&&&&&& from&& sysobjects&& a,sysobjects&& b&&&&&&&&&&&&&& where&& a.id&& =&& object_id(@s_index)&& and&&&&&&&&&&&&&&&&&&&&&&&&&& a.parent_obj&& =&& b.id&&&&&&&&&&&& dbcc&& indexdefrag(0,@s_table,@s_index)&& WITH&& NO_INFOMSGS&&&&&&&&&&&& fetch&& next&& from&& c_index&& into&& @s_index&&&&&&&& end&&&& close&& c_index&&&& deallocate&& c_index=============================================================================以下为表重新构建索引(较对索引进行碎片整理效果更好)& & &DBCC DBREINDEX (TableName1,Index_Name1)&&&&&DBCC DBREINDEX (TableName1,Index_Name2)&&&& DBCC INDEXDEFRAG (TableName2,Index_Name3)&&&& DBCC INDEXDEFRAG (TableName2,Index_Name4)&&&& UPDATE STATISTICS TableName1&&&& UPDATE STATISTICS TableName2
阅读(1216)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'SQL2000升级到SQL2005后系统整体慢,索引整理试验',
blogAbstract:'数据库从使用SQL2000升级到使用SQL2005使用的升级方法是,备份原2000的数据库后,直接恢复到2005的数据库上之后通过较长时间的使用后(大概一年的时间),发现速度明显慢这期间内一直有速度慢的现象.下面是试图解决该问题的步骤:1.在企业管理器中数据库右键弹出的属性中在\"选项\"标签页将兼容级别从80修改到90如下图:&2.对索引进行碎片整理或者重建索引& &下面文章来自网络:===================================================================================',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}win7系统安装SQLServer2000的详细步骤(图文)
投稿:mdxy-dxy
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了win7系统安装SQLServer2000的详细步骤,里面有一些需要注意的事项,大家可以参考下
&&&&&&&&首先,如果以前安装的话,要删除干净。我也找了半天的网络资料。1.把原来SQLServer的安装目录 C:\Program Files\Microsoft SQL Server &删除2.所有SQLServer相关的注册表全部删除,保证系统是没有装过SQLServer的状态注册表打开方式:开始--&运行--&regedit然后找下面目录删除 &1).hkey_current_user\software\miocrosoft\MICROSOFT & SQL & SERVER 文件夹删除 &2).hkey_current_user\software\miocrosoft\mssqlserver &文件夹删除 &3).HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server &文件夹删除总之一句话,把所有SqlServer相关的删除。然后重启机器开始装。
29.跳出一个提示,选是。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具sql2000 索引碎片问题
[问题点数:20分,结帖人wufeng4552]
sql2000 索引碎片问题
[问题点数:20分,结帖人wufeng4552]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。SQL&Server&2000索引碎片整理
本文链接:
set nocount on
declare @dbname varchar(50)
set @dbname='demo_index'
exec ('use )
--建立临时表,将当前库的索引情况添加到临时表中
create table #temp
ObjectName CHAR (255),
ObjectId INT,
IndexName CHAR (255),
IndexId INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL)
insert #temp exec ('dbcc showcontig with
tableresults,all_indexes')
--使用游标重新组织指定库中的索引,消除索引碎片
declare R_Index cursor
for select t.objectname,s1.id,s1.indid,t.LogicalFrag from
sysindexkeys S1
join sysobjects S2 on s1.id=s2.id
join #temp t on t.ObjectName=s2.name
where s2.xtype like 'u'and s1.indid&2
group by t.objectname,s1.id,s1.indid,t.LogicalFrag order by
declare @id int,@indid int,@Logicalfrag int,@Str varchar(500),@name
varchar(100)
open r_index
fetch next from r_index into @name,@id,@indid,@Logicalfrag
while @@fetch_status=0
if @Logicalfrag&=30 --如果碎片大于30,重建索引(脱机完成)
set @str='DBCC DBREINDEX ('+rtrim(@name)+','''+''''+',100)'
else --如果碎片小于30,重新组织索引(联机完成)
set @STR='dbcc indexdefrag ( as
varchar(20))+','+cast(@indid as varchar(20))+')'
-- print @str
exec (@str) --执行
fetch next from r_index into @name,@id,@indid,@Logicalfrag
close r_index
deallocate r_index
drop table #temp
set nocount off
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 win7系统磁盘碎片整理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信