设为首页 收藏本站
查看: 745|回复: 0

[经验分享] SQL Server碎片收集及维护

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-1-13 08:32:01 | 显示全部楼层 |阅读模式
在对表进而对表中定义的索引进行数据修改(INSERT、UPDATE 和DELETE 语句)的整个过程中都会出现碎片。由于这些修改通常并不在表和索引的行中平均分布,所以每页的填充度会随时间而改变。对于扫描表的部分或全部索引的查询,这种碎片会导致附加的页读取。从而延缓了数据的并行扫描。

可以通过自带sys.dm_db_index_physical_stats函数了解索引的碎片情况,此函数返回指定表或视图的数据和索引的大小和碎片信息。对于索引,针对每个分区中的 B 树的每个级别,返回与其对应的一行。对于堆,针对每个分区的 IN_ROW_DATA 分配单元,返回与其对应的一行。对于大型对象 (LOB) 数据,针对每个分区的 LOB_DATA 分配单元返回与其对应的一行。

通过sys.dm_db_index_physical_stats 函数获取碎片超过10的表和索引的信息,代码如下:
    SET NOCOUNTON;
DECLARE@dbid INT;
Select@dbid=DB_ID()
SELECTobject_id ,index_id ,partition_number,avg_fragmentation_in_percent
INTO#cc
FROMsys.dm_db_index_physical_stats (@dbid, NULL, NULL , NULL, 'LIMITED')
WHEREavg_fragmentation_in_percent > 10.0 AND index_id > 0
selectt2.name,t2.schema_id,t1.* into #dd from #cc t1,sys.objects t2
wheret1.object_id=t2.object_id
orderby t2.name
selectt2.name+'.'+t1.name as tablename ,t1.* into #ee
from#dd t1,sys.schemas t2
wheret1.schema_id=t2.schema_id
select t1.tablename,t2.nameasindexname,t1.avg_fragmentation_in_percent,
t1.partition_number from #ee t1,sys.indexes t2
wheret1.index_id=t2.index_id and t1.object_id=t2.object_id
orderby t1.name

通过以上代码,索引或堆的碎片级别显示在 avg_fragmentation_in_percent 列中,对于堆,此值表示堆的区碎片。对于索引,此值表示索引的逻辑碎片。为了获得最佳性能,avg_fragmentation_in_percent 的值应尽可能接近零。但是,从0 到 10% 范围内的值都可以接受。超过此范围的,就需考虑进行维护以提高SQL性能:
其中有三种方法可减少碎片:
  • 删除并重新创建聚集索引。重新创建聚集索引将对数据进行重新分布,从而使数据页填满。填充度可以使用CREATE INDEX 中的 FILLFACTOR 选项进行配置。
  • 碎片在10%至30%之间,进行重新组织索引,使用 ALTER INDEX REORGANIZE按逻辑顺序重新排序索引的叶级页。

:ALTER INDEXindexname on tablename  REORGANIZEwith(online=on)
3.使用 ALTER INDEX REBUILD联机或脱机重新生成索引.
如:ALTER INDEXindexname on tablename  REBUILD With(FillFactor = 90 , Online= On)
注:1.由于分区表不支持联机重建,因此对分区表仅重建有索引碎片的分区;非分区表全表联机重建,设置填充因子为90; partition_number>1为分区表


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-40624-1-1.html 上篇帖子: SQL Server扩展事件(Extended Events)-- 使用扩展事件不同目标示例 下篇帖子: SQL Server ReportService 报表管理器匿名登录小工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表