论索引碎片

前言 : 最近系统越来越慢,有时候几个小时内都无法使用,
前期我进行过读写分离 ,但是效果还是达不到预期, 最后进行系统跟踪才发现,然来是由于存在大量的索引碎片导致系统对一些大表进行数据操作时,
变的非常慢。


索引碎片简介

SQL存储的概念,sql是按页单位进行数据存储,
每一页包含 8060字节。
每一个区包含8个页
索引碎片分为 内部碎片和外部碎片两种。
索引碎片的产生:
外部碎片产生的原因:当我们插入一行数据时,当前页剩余空间无法满足数据插入所需的空间,此时就是
发生分页现象(一条数据插入两页中),此时就会导致外部碎片
内部碎片:当数据表中一行数据大于 8060时候,就会产生一页无法放置一行数据,就会产生
内部碎片,内部碎片对查询有很大的影响。

(故建表时,要进行保证数据行插入的倍数可以整除8060)


查询索引碎片的方法

SELECT object_name(dt.object_id) Tablename,si.name IndexName,
dt.avg_fragmentation_in_percent AS ExternalFragmentation,
dt.avg_page_space_used_in_percent AS InternalFragmentation FROM
( SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (db_id(‘数据库名’),null,null,null,’DETAILED’ )
WHERE index_id <> 0) AS dt INNER JOIN sys.indexes si ON si.object_id=dt.object_id
AND si.index_id=dt.index_id
AND dt.avg_fragmentation_in_percent>10 AND
dt.avg_page_space_used_in_percent<75 ORDER BY avg_fragmentation_in_percent DESC 索引碎片展示结果

解决办法:

定时重新生成 或 重新组织索引