碎片产生

在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构

SQL Server向每个页内存储数据的最小单位是表的行(Row)

当叶子节点中新插入的行或更新的行使得叶子节点无法容纳当前更新或者插入的行时,分页就产生了

在分页的过程中,就会产生碎片

碎片分类

外部碎片

理解外部碎片的这个“外”是相对页面来说的,外部碎片指的是由于分页而产生的碎片

qq 20170407094601

在SQL SERVER中,新的页是随着数据的增长不断产生的,而聚集索引要求行之间连续,所以很多情况下分页后和原来的页在磁盘上并不连续

对性能的影响

由于分页会导致数据在页之间的移动,所以如果插入更新等操作经常需要导致分页,则会大大提升IO消耗,造成性能下降

而对于查找来说,在有特定搜索条件,比如where子句有很细的限制或者返回无序结果集时,外部碎片并不会对性能产生影响。但如果要返回扫描聚集索引而查找连续页面时,外部碎片就会产生性能上的影响

在SQL Server中,比页更大的单位是区(Extent).一个区可以容纳8个页.区作为磁盘分配的物理单元.所以当页分割如果跨区后,需要多次切区。需要更多的扫描.因为读取连续数据时会不能预读,从而造成额外的物理读,增加磁盘IO

外部碎片对于性能的影响,主要是在于需要进行更多的跨区扫描,从而造成更多的IO操作

内部碎片

内部碎片的”内”也是相对页来说的

创建一张表,插入小于8060字节的数据,此时数据在1页上。之后更新数据,使数据大于8060字节,则需要分页,在两个页上都出现了碎片

image

对性能的影响

内部碎片会造成数据行分布在更多的页中,从而加重了扫描的页树,也会降低查询性能

查询碎片

--选择好目标数据库,新建查询执行下列语句

--显示数据库里所有索引的碎片信息

DBCC SHOWCONTIG WITH ALL_INDEXES

--显示指定表的所有索引的碎片信息

DBCC SHOWCONTIG (authors) WITH ALL_INDEXES

--显示指定索引的碎片信息

DBCC SHOWCONTIG (authors,aunmind)

数据解释

扫描页数:如果你知道行的近似尺寸和表或索引里的行数,那么你可以估计出索引里的页数。看看扫描页数,如果明显比你估计的页数要高,说明存在内部碎片

扫描扩展盘区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少

扩展盘区开关数:该数应该等于扫描扩展盘区数减1。高了则说明有外部碎片

每个扩展盘区上的平均页数:该数是扫描页数除以扫描扩展盘区数,一般是8。小于8说明有外部碎片

扫描密度[最佳值:实际值]:DBCC SHOWCONTIG返回最有用的一个百分比。这是扩展盘区的最佳值和实际值的比率。该百分比应该尽可能靠近100%。低了则说明有外部碎片

逻辑扫描碎片:无序页的百分比。该百分比应该在0%到10%之间,高了则说明有外部碎片

扩展盘区扫描碎片:无序扩展盘区在扫描索引叶级页中所占的百分比。该百分比应该是0%,高了则说明有外部碎片

每页上的平均可用字节数:所扫描的页上的平均可用字节数。越高说明有内部碎片,不过在你用这个数字决定是否有内部碎片之前,应该考虑fill factor(填充因子)

平均页密度(完整):每页上的平均可用字节数的百分比的相反数。低的百分比说明有内部碎片

碎片整理

删除并重建索引

用DROP INDEX和CREATE INDEX或ALTER TABLE来删除并重建索引有些缺陷包括在删除重建期间索引会消失。在索引删除重建时,对于查询它不再可用,查询性能也许会受到明显的影响,直到重建索引为止。另一个潜在的缺陷是当都请求索引的时候会引起阻塞,直到重建索引为止。通过其他的处理也能解决阻塞,就是索引被使用的时候不删除索引。另一个主要的缺陷是在用DROP INDEX和CREATE INDEX重建聚集索引时会引起非聚集索引重建两次。删除聚集索引时非聚集索引的行指针会指向数据堆,聚集索引重建时非聚集索引的行指针又会指回聚集索引的行位置。

删除并重建索引的确有一个好处就是通过重新排序索引页,使索引页紧凑并删除不需要的索引页来完全重建索引。你也许需要考虑那些内部和外部碎片都很高的情况下才使用,以使那些索引回到它们应该在的位置。

使用DROP_EXISTING子句重建索引

为了避免在重建聚集索引时表上的非聚集索引重建两次,可以使用带DROP_EXISTING子句的CREATE INDEX语句。这个子句会保留聚集索引键值,以避免非聚集索引重建两次。和删除并重建索引一样,该方法也可能会引起阻塞和索引消失的问题。该方法的另一个缺陷是也强迫你去分别发现和修复表上的每一个索引。

除了和上一个方法一样的好处之外,该方法的好处是不必重建非聚集索引两次。这样可以对那些带约束的索引提供正确的索引定义以符合约束的要求。

执行DBCC DBREINDEX

DBCC DBREINDEX类似于第二种方法,但它物理地重建索引,允许SQLServer给索引分配新页来减少内部和外部碎片。DBCC DBREINDEX也能动态的重建带约束的索引,不像第二种方法。

DBCC DBREINDEX的缺陷是会遇到或引起阻塞问题。DBCC DBREINDEX是作为一个事务来运行的,所以如果在完成之前中断了,那么你会丢失所有已经执行过的碎片。

执行DBCC INDEXDEFRAG

DBCC INDEXDEFRAG(在SQLServer2000中可用)按照索引键的逻辑顺序,通过重新整理索引里存在的叶页来减少外部碎片,通过压缩索引页里的行然后删除那些由此产生的不需要的页来减少内部碎片。它不会遇到阻塞问题但它的结果没有其他几个方法彻底。这是因为DBCC INDEXDEFRAG跳过了锁定的页且不使用任何新页来重新排序索引。如果索引的碎片数量大的话你也许会发现DBCC INDEXDEFRAG比重建索引花费的时间更长。DBCC INDEXDEFRAG比其他方法的确有好处的是在其他过程访问索引时也能进行碎片整理,不会引起其他方法的阻塞问题。

dbcc dbreindex server sql_SQL Server数据库碎片整理相关推荐

  1. dbcc dbreindex server sql_SQL Server性能的提高,可通过DBCC DBREINDEX重建索引

    以下的文章主要介绍的是DBCC DBREINDEX重建索引对SQL Server性能进行提高的实际操作步骤,大多数SQL Server数据库表需要索引来对数据的实际访问速度进行提高,如果没有索引,SQ ...

  2. CMDS目的端数据库碎片整理记录

    CMDS目的端数据库碎片整理记录 看看数据库里面需要做整理的表有哪些,条件可以根据需求稍微改动一下 SQL> select * from ( 2 select a.owner, 3 a.tabl ...

  3. dbcc dbreindex server sql_SQL Server2005索引碎片分析和解决方法

    摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根据工作量的特征,这些碎片会影响对应的工作性能.此文帮助决定是否需要整理碎片以改善性能的信息.SQL Se ...

  4. SQL Server数据库碎片整理

    碎片产生   在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构   SQL Server向每个页内存储数据的最小单位是表的行(Row) ...

  5. SqlServer数据库碎片整理——BCC SHOWCONTIG

    SQLServer提供了一个数据库命令--DBCC SHOWCONTIG--来确定一个指定的表或索引是否有碎片.  示例: 显示数据库里所有索引的碎片信息 DBCC SHOWCONTIG WITH A ...

  6. 2008日志清理 server sql_SQL Server 2008 收缩日志 清空删除大日志文件

    由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消: (SQL2005) BackupLog DNName with no_log go ...

  7. as cast float server sql_Sql Server中Float格式转换字符串varchar方法

    SELECT CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2))) SELECT STR(@testFloat, 38, 2) 从Excel ...

  8. as cast float server sql_Sql Server中Float格式转换字符串varchar方法(转)

    SELECT CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2))) SELECT STR(@testFloat, 38, 2) 从Excel ...

  9. Mysql碎片恢复_mysql数据库碎片整理

    https://blog.csdn.net/liumangjuntuan/article/details/82379660 https://www.cnblogs.com/wanbin/p/95554 ...

最新文章

  1. mysql远程连接工具 cen_Navicat远程连接Centos数据库Mysql
  2. 小白兔写话_聪明的小白兔看图写话
  3. Linux装多个apache,windows linux如何安装多个apache?
  4. 日常办公会用到的python模块-Python如何去实际提高工作的效率?也许这个会有用!...
  5. 一起学nRF51xx 14 -  temp
  6. Java反射最佳实践
  7. re:Invent 大会第一天,看看AWS有哪些最新进展?\n
  8. oracle如何避免表锁定,Oracle 解决表锁定的问题
  9. ios 相册 同时选择多张图片
  10. 单变量微分、导数与链式法则
  11. GitHub+Hexo 搭建个人网站详细教程(转载)
  12. 维基百科-D3.js
  13. HTML5 终于定稿,八年后我们再一次谈谈怎么改变世界
  14. BigWorld MMO
  15. Eclipse rap 开发经验总结
  16. 简单理解椭圆曲线的非对称加密应用
  17. 如何转换字体为手写体?艺术字体在线生成器怎么用?
  18. 达内python培训靠谱吗
  19. C\C++开发的经典魔塔小游戏--(3)主要逻辑处理,角色控制
  20. Mathcad使用数学表达式

热门文章

  1. 零窗口探测怎么抓包_天问·探路火星|五大亮点!最快“胖五”把探测器送入苍穹...
  2. 协议处理程序初始化失败_域间路由协议的内容有哪些 域间路由协议的内容介绍【详解】...
  3. 怎么样才显示暗=安装好了mysql_linux mysql安装
  4. inc si指令的作用_【Vue】Re04 指令:第二部分 - emdzz
  5. HP-UX Oracle Ioctl ASYNC_CONFIG error=1
  6. ERP流程的一个生动的示例~~
  7. android nfc 跳转,android – 通过NFC发送URL,由浏览器打开
  8. HTML5 dataset遍历,H5中data-xxxx属性
  9. 带你学 Redis: 基本命令 String 操作(三)
  10. react-redux基本写法