SQL 2008 有没有自带的重建索引,整理碎片的功能。

zhangzhen_927116 2013-12-04 11:14:49
SQL 2008 有没有自带的重建索引,整理碎片的功能。
公司现在数据库30G查询速度有点慢。
...全文
932 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-12-04
  • 打赏
  • 举报
回复
引用 5 楼 zhangzhen_927116 的回复:
[quote=引用 2 楼 yupeigu 的回复:]
用维护计划就行的。


公司服务器全部按照的都是英文。一个都看不懂。然后我从来没有弄过这个重建索引。整理碎片。有什么好的资料吗?
[/quote]

呵呵,建议你用维护计划把,

通过SQL Server的维护计划来实现:每周数据库完整备份、每天差异备份、每小时日志备份
http://blog.csdn.net/sqlserverdiscovery/article/details/11020057

这个例子是备份数据库,前面的步骤都差不多,下面我把重建索引的,图给你贴出来看看:

第5步是这个图:




然后一步,一步设置就行,不如,选择数据库,选择你要重建索引的表,等等。
Landa_Jimmy 2013-12-04
  • 打赏
  • 举报
回复
引用 6 楼 zhangzhen_927116 的回复:
[quote=引用 1 楼 u012173239 的回复:]
CREATE PROCEDURE [dbo].[Pro_IndexDefrag]
@DbName Varchar(50),   --数据库名
@Mode Varchar(10),     --扫描模式 
        --LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。
        --SAMPLED:模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用DETAILED模式代替 SAMPLED。
        --DETAILED:模式将扫描所有页并返回所有统计信息。
@avg_fragmentation_in_percent Decimal,  --碎片百分比检测最小值
@RebuildPercent Decimal  --重建索引的碎片百分比最小值
AS
BEGIN
 SET NOCOUNT ON;
 Declare @Sql Varchar(max),@TableName Varchar(50),@SchemaName Varchar(50),@IndexName Varchar(50),@FragmentPercent Decimal
 If Exists(Select * From sys.objects Where OBJECT_ID=OBJECT_ID('##Temp_IndexDefrag'))
  Drop Table ##Temp_IndexDefrag
 --获取非小表(页数>8)碎片百分比超过@avg_fragmentation_in_percent的索引及相关信息
 Set @Sql='Select t.Name As TableName '+
     ',sc.Name As SchemaName '+
     ',i.name As IndexName '+
     ',s.avg_fragmentation_in_percent As FragmentPercent '+
    'Into ##Temp_IndexDefrag '+
    'From sys.dm_db_index_physical_stats(DB_ID('''+@DbName+'''),NULL,NULL,'+
               'NULL,'''+@Mode+''') AS s '+
       'Join sys.indexes i '+
       'On s.object_id=i.object_id And s.index_id=i.index_id '+
       'Join sys.tables t '+
       'On i.object_id=t.object_id '+
       'Join sys.schemas sc '+
       'On t.schema_id=sc.schema_id '+
    'Where s.avg_fragmentation_in_percent>'+Convert(Varchar(10),@avg_fragmentation_in_percent)+
       ' And t.Type=''U'''+
       ' And s.page_count>8'
 Exec (@Sql)
 --利用游标:判断碎片百分比20~40的重新组织索引,超过40的重建索引
 Declare cs Cursor For
  Select TableName,SchemaName,IndexName,FragmentPercent From ##Temp_IndexDefrag
 Open cs
 Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 While @@FETCH_STATUS=0
 Begin
  If @FragmentPercent Between @avg_fragmentation_in_percent And @RebuildPercent  --碎片比率在XX%~YY%的重新组织
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REORGANIZE'
   Exec (@Sql)
  End
  Else ----碎片比率超过YY%的重建
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REBUILD'
   Exec (@Sql)
  End
  Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 End 
 Close cs
 Deallocate cs
 Drop Table ##Temp_IndexDefrag
END
GO
这个是重建数据库所有表的索引吗?[/quote]是的
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 4 楼 wufeng4552 的回复:
1)可以自己写脚本,根据碎片的百分比情况执行重建,JOB定时执行 2)用维护计划
就是自己不知道咋写。才问有没有自带的。。
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 1 楼 u012173239 的回复:
CREATE PROCEDURE [dbo].[Pro_IndexDefrag]
@DbName Varchar(50),   --数据库名
@Mode Varchar(10),     --扫描模式 
        --LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。
        --SAMPLED:模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用DETAILED模式代替 SAMPLED。
        --DETAILED:模式将扫描所有页并返回所有统计信息。
@avg_fragmentation_in_percent Decimal,  --碎片百分比检测最小值
@RebuildPercent Decimal  --重建索引的碎片百分比最小值
AS
BEGIN
 SET NOCOUNT ON;
 Declare @Sql Varchar(max),@TableName Varchar(50),@SchemaName Varchar(50),@IndexName Varchar(50),@FragmentPercent Decimal
 If Exists(Select * From sys.objects Where OBJECT_ID=OBJECT_ID('##Temp_IndexDefrag'))
  Drop Table ##Temp_IndexDefrag
 --获取非小表(页数>8)碎片百分比超过@avg_fragmentation_in_percent的索引及相关信息
 Set @Sql='Select t.Name As TableName '+
     ',sc.Name As SchemaName '+
     ',i.name As IndexName '+
     ',s.avg_fragmentation_in_percent As FragmentPercent '+
    'Into ##Temp_IndexDefrag '+
    'From sys.dm_db_index_physical_stats(DB_ID('''+@DbName+'''),NULL,NULL,'+
               'NULL,'''+@Mode+''') AS s '+
       'Join sys.indexes i '+
       'On s.object_id=i.object_id And s.index_id=i.index_id '+
       'Join sys.tables t '+
       'On i.object_id=t.object_id '+
       'Join sys.schemas sc '+
       'On t.schema_id=sc.schema_id '+
    'Where s.avg_fragmentation_in_percent>'+Convert(Varchar(10),@avg_fragmentation_in_percent)+
       ' And t.Type=''U'''+
       ' And s.page_count>8'
 Exec (@Sql)
 --利用游标:判断碎片百分比20~40的重新组织索引,超过40的重建索引
 Declare cs Cursor For
  Select TableName,SchemaName,IndexName,FragmentPercent From ##Temp_IndexDefrag
 Open cs
 Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 While @@FETCH_STATUS=0
 Begin
  If @FragmentPercent Between @avg_fragmentation_in_percent And @RebuildPercent  --碎片比率在XX%~YY%的重新组织
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REORGANIZE'
   Exec (@Sql)
  End
  Else ----碎片比率超过YY%的重建
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REBUILD'
   Exec (@Sql)
  End
  Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 End 
 Close cs
 Deallocate cs
 Drop Table ##Temp_IndexDefrag
END
GO
这个是重建数据库所有表的索引吗?
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
用维护计划就行的。
公司服务器全部按照的都是英文。一个都看不懂。然后我从来没有弄过这个重建索引。整理碎片。有什么好的资料吗?
水族杰纶 2013-12-04
  • 打赏
  • 举报
回复
1)可以自己写脚本,根据碎片的百分比情况执行重建,JOB定时执行 2)用维护计划
小魚人 2013-12-04
  • 打赏
  • 举报
回复
最好是写个脚本,定时重建整理索引
LongRui888 2013-12-04
  • 打赏
  • 举报
回复
用维护计划就行的。
Landa_Jimmy 2013-12-04
  • 打赏
  • 举报
回复
CREATE PROCEDURE [dbo].[Pro_IndexDefrag]
@DbName Varchar(50),   --数据库名
@Mode Varchar(10),     --扫描模式 
        --LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。
        --SAMPLED:模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用DETAILED模式代替 SAMPLED。
        --DETAILED:模式将扫描所有页并返回所有统计信息。
@avg_fragmentation_in_percent Decimal,  --碎片百分比检测最小值
@RebuildPercent Decimal  --重建索引的碎片百分比最小值
AS
BEGIN
 SET NOCOUNT ON;
 Declare @Sql Varchar(max),@TableName Varchar(50),@SchemaName Varchar(50),@IndexName Varchar(50),@FragmentPercent Decimal
 If Exists(Select * From sys.objects Where OBJECT_ID=OBJECT_ID('##Temp_IndexDefrag'))
  Drop Table ##Temp_IndexDefrag
 --获取非小表(页数>8)碎片百分比超过@avg_fragmentation_in_percent的索引及相关信息
 Set @Sql='Select t.Name As TableName '+
     ',sc.Name As SchemaName '+
     ',i.name As IndexName '+
     ',s.avg_fragmentation_in_percent As FragmentPercent '+
    'Into ##Temp_IndexDefrag '+
    'From sys.dm_db_index_physical_stats(DB_ID('''+@DbName+'''),NULL,NULL,'+
               'NULL,'''+@Mode+''') AS s '+
       'Join sys.indexes i '+
       'On s.object_id=i.object_id And s.index_id=i.index_id '+
       'Join sys.tables t '+
       'On i.object_id=t.object_id '+
       'Join sys.schemas sc '+
       'On t.schema_id=sc.schema_id '+
    'Where s.avg_fragmentation_in_percent>'+Convert(Varchar(10),@avg_fragmentation_in_percent)+
       ' And t.Type=''U'''+
       ' And s.page_count>8'
 Exec (@Sql)
 --利用游标:判断碎片百分比20~40的重新组织索引,超过40的重建索引
 Declare cs Cursor For
  Select TableName,SchemaName,IndexName,FragmentPercent From ##Temp_IndexDefrag
 Open cs
 Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 While @@FETCH_STATUS=0
 Begin
  If @FragmentPercent Between @avg_fragmentation_in_percent And @RebuildPercent  --碎片比率在XX%~YY%的重新组织
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REORGANIZE'
   Exec (@Sql)
  End
  Else ----碎片比率超过YY%的重建
  Begin
   Set @Sql='Alter Index '+@IndexName+'On '+@DbName+'.'+@SchemaName+'.'+@TableName+'REBUILD'
   Exec (@Sql)
  End
  Fetch Next From cs Into @TableName,@SchemaName,@IndexName,@FragmentPercent
 End 
 Close cs
 Deallocate cs
 Drop Table ##Temp_IndexDefrag
END
GO
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
暂时来说对你估计太高要求了,先重建索引吧
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 21 楼 DBA_Huangzj 的回复:
重建已经帮你整理碎片了。不用再搞,我是说你以后要研究一下碎片增长是否合理
哦这样啊。 谢谢
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
重建已经帮你整理碎片了。不用再搞,我是说你以后要研究一下碎片增长是否合理
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
这东西图形化操作,多搞几次就熟悉了,绝大部分功能都不需要太过深入
那就是还要建立一个整理碎片的维护计划咯 那在哪里可以知道是否开启呢?
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
引用 18 楼 zhangzhen_927116 的回复:
[quote=引用 16 楼 DBA_Huangzj 的回复:] 第一步: 第二步:选择库,直接点OK 第三步:选时间执行,这个应该看得懂吧: 第四部:保存,开启sql agent,等时间
是不是有了这个计划后面的整理碎片都不需要了?[/quote]1、sql agent就是sql代理,也就是自动运行计划的东西,服务器应该有启动吧,毕竟备份那些也要用的。 2、碎片这东西,如果你不想管,那就让这个维护计划帮你重建,但是到真正的性能分析阶段,就要分析为什么会产生那么多碎片,碎片增长是否合理等,不能直接重建就了事
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
第一步: 第二步:选择库,直接点OK 第三步:选时间执行,这个应该看得懂吧: 第四部:保存,开启sql agent,等时间
是不是有了这个计划后面的整理碎片都不需要了?
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
第一步: 第二步:选择库,直接点OK 第三步:选时间执行,这个应该看得懂吧: 第四部:保存,开启sql agent,等时间
最后的启用SQL agent 是什么。保存后就可以不要管他了吧。到之间他自己自动启动的吧
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
第一步:

第二步:选择库,直接点OK

第三步:选时间执行,这个应该看得懂吧:


第四部:保存,开启sql agent,等时间
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
这东西图形化操作,多搞几次就熟悉了,绝大部分功能都不需要太过深入
zhangzhen_927116 2013-12-04
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
我建议你在本地自己整整再到上面操作
恩。先在本机上安装了个2008在去上面弄。怕吧服务器给弄瘫了
發糞塗牆 2013-12-04
  • 打赏
  • 举报
回复
我建议你在本地自己整整再到上面操作
加载更多回复(3)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧