博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server性能优化(14)索引碎片
阅读量:6273 次
发布时间:2019-06-22

本文共 1022 字,大约阅读时间需要 3 分钟。

一、 外部碎片和内部碎片的概念

碎片的概念和检测,参考MSDN:

二、对于碎片的解决办法


解决办法都是基于对索引的重建和整理,只是方式不同

1.删除索引并重建

       这种方式并不好.在删除索引期间,索引不可用.会导致阻塞发生。而对于删除聚集索引,则会导致对应的非聚集索引重建两次(删除时重建,建立时再重建).虽然这种方法并不好,但是对于索引的整理最为有效

    2.使用DROP_EXISTING语句重建索引

       为了避免重建两次索引,使用DROP_EXISTING语句重建索引,因为这个语句是原子性的,不会导致非聚集索引重建两次,但同样的,这种方式也会造成阻塞

    3.如前面文章所示,使用ALTER INDEX REBUILD语句重建索引

       使用这个语句同样也是重建索引,但是通过动态重建索引而不需要卸载并重建索引.是优于前两种方法的,但依旧会造成阻塞。可以通过ONLINE关键字减少锁,但会造成重建时间加长.

    4.使用ALTER INDEX REORGANIZE

这种方式不会重建索引,也不会生成新的页,仅仅是整理,当遇到加锁的页时跳过,所以不会造成阻塞。但同时,整理效果会差于前三种.

三、 填充引子

填充因子是解决碎片的一个好办法。创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余空间作为以后扩展索引的可用空间。例如,指定填充因子的值为 80 表示每个叶级页上将有 20% 的空间保留为空,以便随着向基础表中添加数据而为扩展索引提供空间。 在索引行之间保留可用空间,而不是在索引的末尾保留。

如何设置填充因子的值(参考1)


    如何设置填充因子的值并没有一个公式或者理念可以准确的设置。使用填充因子虽然可以减少更新或者插入时的分页,但同时因为需要更多的页,所以降低了查询的性能和占用更多的磁盘空间.如何设置这个值进行trade-off需要根据具体的情况来看.

    具体情况要根据对于表的读写比例来看,我这里给出我认为比较合适的值:

    1.当读写比例大于100:1时,不要设置填充因子,100%填充

    2.当写的次数大于读的次数时,设置50%-70%填充

    3.当读写比例位于两者之间时80%-90%填充

   

 

参考:

1. ,图标的形式展示了,什么是内部外部碎片。

2. MSDN为索引指定填充因子:

3. 优化索引碎片:

转载于:https://www.cnblogs.com/ustcyc/p/4527216.html

你可能感兴趣的文章
zookeeper系列(八)zookeeper运维
查看>>
Linux下的lds链接脚本简介(二)
查看>>
入门到进阶React
查看>>
C++每日练笔之日期类(基类)
查看>>
SVN 命令笔记
查看>>
修复Postfix 的Relay access denied问题
查看>>
检验手机号码
查看>>
thinkphp3.1随机取数据库中几条记录
查看>>
重叠(Overlapped)IO模型
查看>>
ffmpeg study 1
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
java对象--继承的好处和特点
查看>>
MySQL 5.6 for Windows 解压缩版配置安装
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>