图片 1

二. 解决碎片方法

-------------sqlserver 2000 碎片解决--------------
-- 索引重建 充填因子80
dbcc dbreindex(PUB_StockCategory,'PK_PUB_StockCategory',80)
-- 索引重组
DBCC INDEXDEFRAG(dbname,PUB_StockCategory,'PK_PUB_StockCategory')

 

------------sqlserver 2005以上碎片解决--------
-- 重新组织表中单个索引 
 ALTER INDEX ix_pub_stock_2 ON dbo.PUB_Stock REORGANIZE  
 -- 重新组织表中的所有索引
 ALTER INDEX ALL ON dbo.PUB_Stock REORGANIZE  
 -- 重新生成表中单个索引 (重点:重建索引用)
 ALTER INDEX ix_pub_stock_2 ON dbo.PUB_Stock REBUILD
 -- 重新生成表中的所有索引 
 ALTER INDEX ALL  ON dbo.PUB_Stock  
 REBUILD  WITH(FILLFACTOR=80, SORT_IN_TEMPDB=ON ,STATISTICS_NORECOMPUTE = ON )
  • avg_fragmentation_in_percent:碎片百分比,合理的百分比是在10左右,比例越大,索引碎片更加多,读取品质越差;
  • fragment_count:分段的多少,理论上,分段(Fragment)数量越少越好,直接表明索引的情理顺序和逻辑顺序越相称;
  • avg_fragment_size_in_pages:各样分段平均带有的Page数量,Fragment的Size
    越大,读取一样数量的Pages所需的IO越少,读取质量越好;
  • avg_page_space_used_in_percent:Page空间的平均利用率,值越大,页内碎片越小;
  • avg_fragmentation_in_percent >5% and <=四分三:
    重组索引(ALTE瑞虎 INDEX REOLacrosseGANIZE);
  • avg_fragmentation_in_percent >40%: 重新创建索引(ALTE奥迪Q3 INDEX
    REBUILD);

 

一 . dm_db_index_physical_stats 主要字段表达

  1.1 内部碎片:是avg_page_space_used_in_percent字段。是指页的填充度,为了使磁盘使用情况达到最优,对于尚未过多Infiniti制插入的目录,此值迎接近100%。 但是,对于有所多数即兴插入且页很满的目录,其页拆分数将持续充实。 那将促成更加多的散装。 因而,为了削减页拆分,此值应低于
100%。

  1.2
外界碎片:也叫逻辑碎片是avg_fragmentation_in_percent字段。是分页的逻辑顺序和情理顺序不宽容恐怕索引具有的扩张不总是时发出。当对表中定义的目录举办数量修改(INSERT、UPDATE
和 DELETE 语句)的所有事过程中都晤面世零星。
由于那一个改换平日并不在表和目录的行中平均布满,所以每页的填充度会随时间而改换。
对于扫描表的一部分或任何索引的查询,这种碎片会促成额外的页读取。
那会妨碍数据的互相扫描。

  1.3 使用查看dm_db_index_physical_stats索引碎片 (SQL server
二零零六之上)。

SELECT OBJECT_NAME(sys.indexes.OBJECT_ID) AS tableName,
 sys.indexes.name,   
 page_count,
 (page_count*8.0)AS 'IndexSizeKB',
 avg_page_space_used_in_percent,
 avg_fragmentation_in_percent,
 record_count,avg_record_size_in_bytes,
index_type_desc,
fragment_count 
from sys.dm_db_index_physical_stats(db_id('dbname'),object_id('tablename'), null,null,'sampled') 
 JOIN sys.indexes  ON   sys.indexes.index_id = sys.dm_db_index_physical_stats.index_id
 AND sys.indexes.object_id = sys.dm_db_index_physical_stats.object_id

    上面依然接着上一篇查询PUB_StockCollect表下的目录

图片 1

  (1)
avg_fragmentation_in_percent(外部碎片也叫逻辑碎片):最关键的列,索引碎片百分比。
    val >百分之十 and val<= 33.33% ————-索引重组(碎片整理)
alter index reorganize )
    val >四成 ————————–索引重新建立 alter index
rebulid with (online=on)
    avg_fragmentation_in_percent:大面积的散装(当碎片大于十分之四),恐怕要求索引重新建立
  (2) page_count:索引或数据页的总额。
  (3)
avg_page_space_used_in_percent(内部碎片):最器重列:页面平均使用率也叫存款和储蓄空间的平分百分比,
值越高(以百分之九十填充度为参谋试的地点) 页存款和储蓄数据就更加多,内部碎片越少。
  (4) avg_record_size_in_bytes:平均记录大小(字节)。
  (5) index_type_desc列:索引类型-集中索引或然非集中索引等。
  (6) record_count:总记录数,也正是行数。
  (7) fragment_count: 碎片数。

数据更新和数码检索是此消彼长的涉及,在索引页中留给空闲空间会扩张索引的Size,然则,额外占用的硬盘空间须要万分的硬盘IO加载到内部存款和储蓄器中,这不利于数据的研究,可是,当发生多少更新时,预留的上空能够容纳数据行Size的增添,收缩页拆分爆发的次数,那便于数据的换代,因而,在再三更新的数据库系统中,为了削减页拆分的次数,需求人工扩大索引的内部碎片:

sys.dm_db_index_physical_stats
(Transact-SQL).aspx)

举目四望格局

透过施行函数,检验索引的散装:

select ps.database_id,
    ps.object_id,
    ps.index_id,
    ps.partition_number,
    ps.index_type_desc,
    ps.alloc_unit_type_desc,
    ps.index_depth,
    ps.index_level,
    ps.avg_fragmentation_in_percent,
    ps.fragment_count,
    ps.avg_fragment_size_in_pages,
    ps.page_count,
    ps.avg_page_space_used_in_percent,
    ps.record_count,
    ps.ghost_record_count,
    ps.version_ghost_record_count,
    ps.min_record_size_in_bytes,
    ps.max_record_size_in_bytes,
    ps.avg_record_size_in_bytes,
    ps.forwarded_record_count,
    ps.compressed_page_count
from sys.dm_db_index_physical_stats(database_id,object_id,index_id,partition_number,'detailed') as ps
order by ps.index_level
  1.   dbcc showcontig:四片段指标名,【索引名】|【索引id】
  2.   dbcc showcontig:当前库对象id,【索引名】|【索引id】    
  3.   sys.dm_db_index_physical_stats:数据库id,对象id,索引id,分区id,扫描方式
  • FILLFACTOR = fillfactor
  • PAD_INDEX = { ON | OFF }

在数额的大意存款和储蓄上,索引和数据存款和储蓄在硬盘上的数据文件中,数据文件以页(Page)为最小单位划分,每一个Page是8KB,物理地点上连接的8个Page叫做一个区(Extent),每三个区是64KB。区是空中分配的主干单位,而页是多少存款和储蓄的宗旨单位。

最佳实践
请始终确保使用 DB_ID 或 OBJECT_ID 时返回了有效的 ID。例如,在使用 OBJECT_ID 时,请指定三部分的名称,如 OBJECT_ID(N'AdventureWorks2008R2.Person.Address'),或者在 sys.dm_db_index_physical_stats 函数中使用由函数返回的值之前对这些值进行测试。下面的示例 A 和 B 演示了一种指定数据库和对象 ID 的安全方法。

检测碎片
在对表进而对表中定义的索引进行数据修改(INSERT、UPDATE 和 DELETE 语句)的整个过程中都会出现碎片。由于这些修改通常并不在表和索引的行中平均分布,所以每页的填充度会随时间而改变。对于扫描表的部分或全部索引的查询,这种碎片会导致附加的页读取。从而延缓了数据的并行扫描。

SQL Server 2008 中的碎片计算算法比 SQL Server 2000 中的更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果一个表的第 11 页和第 13 页在同一区中,而第 12 页不在该区中,该表不被视为含有碎片。但是访问这些页需要两次物理 I/O 操作,因此,在 SQL Server 2008 中,这将算作碎片。

索引或堆的碎片级别显示在 avg_fragmentation_in_percent 列中。对于堆,此值表示堆的区碎片。对于索引,此值表示索引的逻辑碎片。与 DBCC SHOWCONTIG 不同,这两种情况下的碎片计算算法都会考虑跨越多个文件的存储,因而结果是精确的。

逻辑碎片 
这是索引的叶级页中出错页所占的百分比。对于出错页,分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页。

区碎片 
这是堆的叶级页中出错区所占的百分比。出错区是指:包含堆的当前页的区不是物理上的包含前一页的区后的下一个区。

为了获得最佳性能,avg_fragmentation_in_percent 的值应尽可能接近零。但是,从 0 到 10% 范围内的值都可以接受。所有减少碎片的方法(例如重新生成、重新组织或重新创建)都可用于降低这些值。有关如何分析索引中碎片程度的详细信息,请参阅重新组织和重新生成索引。

减少索引中的碎片
当索引分段的方式导致碎片影响查询性能时,有三种方法可减少碎片:

1、删除并重新创建聚集索引。
重新创建聚集索引将对数据进行重新分布,从而使数据页填满。填充度可以使用 CREATE INDEX 中的 FILLFACTOR 选项进行配置。这种方法的缺点是索引在删除和重新创建周期内为脱机状态,并且操作属原子级。如果中断索引创建,则不能重新创建索引。有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。

2、使用 ALTER INDEX REORGANIZE(代替 DBCC INDEXDEFRAG)按逻辑顺序重新排序索引的叶级页。由于这是联机操作,因此在语句运行时仍可使用索引。中断此操作时不会丢失已经完成的任务。此方法的缺点是在重新组织数据方面不如索引重新生成操作的效果好,而且不更新统计信息。


3、使用 ALTER INDEX REBUILD(代替 DBCC DBREINDEX)联机或脱机重新生成索引。有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。


不需要仅因为碎片的原因而重新组织或重新生成索引。碎片的主要影响是,在索引扫描过程中会降低页的预读吞吐量。这将导致响应时间变长。如果含有碎片的表或索引中的查询工作负荷不涉及扫描(因为工作负荷主要是单独查找),则删除碎片可能不起作用。有关详细信息,请参阅此 Microsoft 网站。
注意: 
如果在收缩操作中对索引进行部分或完全移动,则运行 DBCC SHRINKFILE 或 DBCC SHRINKDATABASE 可能产生碎片。因此,如果必须执行收缩操作,则不应在删除碎片后进行。



减少堆中的碎片
若要减少堆的区碎片,请对表创建聚集索引,然后删除该索引。在创建聚集索引时将重新分布数据。同时会考虑数据库中可用空间的分布,从而使其尽可能优化。当删除聚集索引以重新创建堆时,数据不会移动并保持最佳位置。有关如何执行这些操作的信息,请参阅 CREATE INDEX 和 DROP INDEX。

压缩大型对象数据
默认情况下,ALTER INDEX REORGANIZE 语句将压缩包含大型对象 (LOB) 数据的页。因为不会释放空的 LOB 页,所以在删除大量 LOB 数据或 LOB 列时,压缩此数据可改善磁盘空间使用情况。

重新组织指定的聚集索引将压缩聚集索引中包含的所有 LOB 列。重新组织非聚集索引将压缩作为索引中非键(已包括)列的所有 LOB 列。如果语句中指定 ALL,则将对与指定表或视图关联的所有索引进行重新组织。此外,将压缩与聚集索引、基础表或带有包含列的非聚集索引关联的所有 LOB 列。

评估磁盘空间使用状况
avg_page_space_used_in_percent 列指示页填充度。为了使磁盘使用状况达到最优,对于没有很多随机插入的索引,此值应接近 100%。但是,对于具有很多随机插入且页很满的索引,其页拆分数将不断增加。这将导致更多的碎片。因此,为了减少页拆分,此值应小于 100%。使用指定的 FILLFACTOR 选项重新生成索引可以改变页填充度,以便符合索引中的查询模式。有关填充因子的详细信息,请参阅填充因子。此外,ALTER INDEX REORGANIZE 还试图通过将页填充到上一次指定的 FILLFACTOR 来压缩索引。这会增加 avg_space_used_in_percent 的值。请注意,ALTER INDEX REORGANIZE 不会降低页填充度。相反,必须执行索引重新生成。

评估索引碎片
碎片由分配单元中同一文件内的物理连续的叶级页组成。一个索引至少有一个碎片。索引可以包含的最大碎片数等于索引的页级别页数。碎片越大,意味着读取相同页数所需的磁盘 I/O 越少。因此,avg_fragment_size_in_pages 值越大,范围扫描的性能越好。avg_fragment_size_in_pages 和 avg_fragmentation_in_percent 值成反比。因此,重新生成或重新组织索引会减少碎片数量,但同时增大碎片大小。

The most efficient order is where the
logical order of the pages and extents(as defined by the index keys,
following the next-page pointers from the page headers) is the same as
the physical order of the pages and extents with the data files. In
other words, the index leaf-lelvel page that has the row with the next
index key is also the next physical contiguous page int the data
file.

索引以B-Tree结构存储在数据文件中,分为叶子节点和非叶子节点,叶子节点用于存款和储蓄数据,而非叶子节点(中间节点和根节点)用于存款和储蓄索引键,节点数据依据索引键排序。理论上,一旦数据集分明下来,索引查找的大运费用就只跟索引结构的层系有关联,档案的次序更加多,查找数据所花费的时辰更加的多。碎片会潜移暗化索引的档期的顺序结构,不过,碎片并不总是破坏者,碎片有助于数据的革新。

 

运用函数 sys.dm_db_index_physical_stats
检查评定碎片的水准,字段 avg_fragmentation_in_percent 
 重临的逻辑碎片的百分比,日常景象下,微软推荐以十分之六为阈值:

图片 2图片 3

  • 在那之中碎片(或说叶级填充率):反映数据叶级的半空中占用率或空闲率
  • 表面碎片:由于sqlserver以一连的8个page作为几个多少库块(区)extent作为读取单位,故此由于大要存款和储蓄上的区和逻辑上分裂(不再三再四)而导致io读取切换

以下脚本使用游标(Cusor)每个整理索引碎片,在重新创立索引(Rebuild
Index)时,使用的目录选项是:FILLFACTO途观 = 95, ONLINE = OFF,
DATA_COMPRESSION = PAGE

  • avg_fragmentation_in_percent:碎片百分比,合理的比例是在10左右,比例越大,索引碎片越来越多,读取质量越差;
  • fragment_count:分段的数额,理论上,分段(Fragment)数量越少越好,直接表明索引的轮廓顺序和逻辑顺序越相配;
  • avg_fragment_size_in_pages:每一个分段平均带有的Page数量,Fragment的Size
    越大,读取同样数量的Pages所需的IO越少,读取质量越好;
  • avg_page_space_used_in_percent:Page空间的平分利用率,值越大,页内碎片越小;

主标题标:

能够由此内置函数:
sys.dm_db_index_physical_stats,查看索引的外表碎片,字段
avg_fragmentation_in_percent
用于表示外界碎片的水平,对于索引,以Page为单位总结碎片;对于堆(Heap),以Extent为单位总计碎片,那是因为Heap结构的页(Page)是未曾各类的。在堆(Heap)的
Page Header中,字段 next_page 和 Pre_page
pointer是null。字段 avg_page_space_used_in_percent
用于表示个中碎片的等级次序,百分比越高,表明单个Page的半空中利用率越高。

1,扫描形式

 

回去的字段深入分析:

再次来到的字段剖判:

 

  • avg_fragmentation_in_percent >5% and <=五分一:
    重组索引(ALTE奥德赛 INDEX REO汉兰达GANIZE);
  • avg_fragmentation_in_percent >三分之一: 重新建立索引(ALTESportage INDEX
    REBUILD);

一,索引碎片

      • 五个参数,基本上,【0(特殊的,index可以为0,故该处为-1)】|【null】|【default】
        意义是同等的

三,碎片整理

以下脚本使用游标(Cusor)每种整理索引碎片,在重新建设构造索引(Rebuild
Index)时,使用的目录选项是:FILLFACTO福特Explorer = 95, ONLINE = OFF,
DATA_COMPRESSION = PAGE

  1. 围观密度(%)[一级计数:实际计数]:这是“最棒计数”与“实际计数”的比值。如若持有剧情都是连接的,则该值为
    100;若是该值小于
    100,则设有有的零散。“最棒计数”是指在一切都总是链接的景况下,区更动的优质数目。“实际计数”是指区退换的骨子里次数。
  2. 逻辑扫描碎片(%):扫描索引的叶级页时再次来到的出错页的比例。此数与堆非亲非故。对于出错页,分配给索引的下二个物理页不是由如今叶级页中的“下一页”指针所指向的页。
  3. 区扫描碎片(%):扫描索引的叶级页时出错区所占的比例。此数与堆无关。对于出错区,满含当前索引页的区在概况上不是带有上二个索引页的区的下一个区。注意:
    如若索引跨更加多个文本,则此数字抽象。
  4. avg_page_space_used_in_percent:平均page空间使用率。相关的概念:页拆分、页填充率
  5. avg_fragment_size_in_pages:平均多少个page就有二个零星,该值
    越大越好
  6. avg_fragmentation_in_percent:碎片率,不表明。该值越小越好,和avg_fragment_size_in_pages
    反比!
  7. page_count:扫描的总page数
  8. record_count:扫描的总记录数。注意:是相持于当下的围观来讲的记录数,不断定是你所感到的
    用户表的一整套数据
  9. forwarded_record_count:页拆分的笔录数据
admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注