Sql server Microsoft SQL Server 2008-非群集、非唯一索引上99%的碎片

Sql server Microsoft SQL Server 2008-非群集、非唯一索引上99%的碎片,sql-server,entity-framework-4,Sql Server,Entity Framework 4,我有一个包含多个索引的表(定义如下)。其中一个索引(IX_external_guid_3)具有99%的碎片率,而无需重新生成/重新组织索引。有没有人知道是什么原因导致了这一问题,或者有没有最好的解决办法 我们使用Entity Framework 4.0来查询,EF在其他索引字段上的查询速度平均比外部_guid_3字段快10倍,但是ADO.Net在这两个字段上的查询速度大致相同(尽管比EF在索引字段上的查询速度慢2倍) 桌子 id(主键,整数,非空) guid(唯一标识符,空,行guid) 外部

我有一个包含多个索引的表(定义如下)。其中一个索引(IX_external_guid_3)具有99%的碎片率,而无需重新生成/重新组织索引。有没有人知道是什么原因导致了这一问题,或者有没有最好的解决办法

我们使用Entity Framework 4.0来查询,EF在其他索引字段上的查询速度平均比外部_guid_3字段快10倍,但是ADO.Net在这两个字段上的查询速度大致相同(尽管比EF在索引字段上的查询速度慢2倍)

桌子

  • id(主键,整数,非空)
  • guid(唯一标识符,空,行guid)
  • 外部_guid_1(唯一标识符,非空)
  • 外部guid_2(唯一标识符,空)
  • 状态(varchar(32),null)
  • 值(varchar(最大值),null)
  • 信息集(XML(.),null)-->通常为2-4K
  • 创建时间(日期时间,空)
  • 更新的时间(日期时间,空)
  • 外部_guid_3(唯一标识符,非唯一标识符) 空)
  • FK_id(FK,int,null)
  • 锁定guid(唯一标识符,null)
  • 锁定时间(日期时间,空)
  • 外部guid_4(唯一标识符, 空)
  • 更正的时间(日期时间,空)
  • 是加(位,非空)分(整数, 空)
  • 行版本(时间戳,空)
索引

  • PK_表(集群)
  • IX_创建时间(非唯一、非群集)
  • IX_外部_guid_1(非唯一、非群集)
  • IX_guid(非唯一、非群集)
  • IX_外部_guid_3(非唯一、非群集)
  • IX_状态(非唯一、非群集)

索引中可能没有足够的数据进行碎片整理。在那里获得了几千行之后,重建和reorg将消除碎片

在索引页计数达到100左右之前,碎片不会影响性能

您还需要验证您的查询是否包含在索引中,以及是否正在使用索引


从ManagementStudio运行查询(如果查询是动态的,您可以使用sql事件探查器或活动监视器捕获查询),然后单击“包含实际执行计划”。这将告诉您正在使用什么索引以及是否包含查询。

。这似乎会对索引进行分段产生副作用。

注意:SQL Server最佳实践表明,页面少于10000页的索引通常不会从性能提升中获益

这里有一个小片段来确定您的数据库何时需要碎片整理。在我们的产品中,我们将其减少到2000,并选择>20%的碎片。 您可以轻松地修改脚本,以告诉您哪些索引是特定的

SELECT COUNT(*) AS fragmented_indexes FROM sys.dm_db_index_physical_stats(DB_ID(), null, null, null, null) as p WHERE p.avg_fragment_size_in_pages <= 1 AND p.avg_fragmentation_in_percent >= 20 AND p.page_count > 2000;
选择COUNT(*)作为sys.dm_db_index_physical_stats(db_ID(),null,null,null,null)中的碎片索引,其中p.avg_fragment_size_in_pages=20,p.page_COUNT>2000;

实际上,guid上的索引可能是罪魁祸首:


最近,我发现了一些似乎支持这一点的引用。

DB目前有200000多行,因此上面的数据量已被覆盖。索引正在执行计划中使用。因此,如果重建索引,碎片是否会减少?不,不会,这就是问题所在。我希望这将是一个简单的解决办法,但自动收缩已经关闭。保罗·兰德尔承认这些数字是他编造的!哇,我不知道。谢谢。但幸运的是,我们运行了我们自己的测试,以确定2000适合我们产品的一般用途,而不会过早地提醒用户(我们让产品告诉用户何时他们可能会根据此查询遇到性能问题)。自最初的答复后,我编辑了SQL,由于它没有考虑平均页面碎片大小或碎片百分比。顺便说一句,管理数据仓库中的报告给出了碎片整理建议,我从未调查过这些建议是基于相同的阈值还是基于不同的阈值。我的索引都不符合此标准。然而,我认为高碎片化的原因是,现在我更仔细地观察索引所覆盖的数据,碎片化率较低的数据在列中有更多的重复数据(100000条记录中约有3000个不同值,而高碎片化索引中每100000条记录中约有99000个不同值)。因此,就性能而言,我似乎找错了方向。谢谢你提供的信息。