在SQL Server中快速分段索引

And*_*eed 6 sql sql-server sql-server-2008

我有一个查询,目前在两个物理服务器上运行只需7秒左右.查询相对复杂,因为它连接了几个表并由实体框架构成.我目前正在将数据库迁移到虚拟托管环境,除了这一个查询之外,一切似乎都没问题.查询虚拟托管的SQL Server实例时,查询最初在7秒内运行,但一两个小时后将突然大约需要8分钟.

在慢速状态下查看执行计划时,我发现了意外的全表扫描.如果我重建该表上的索引,它会立即恢复为7秒.但是,在一个小时左右的时间内,它将转为8分钟.

有问题的表几乎没有变化,我经常能够确定它运行良好和运行缓慢之间的零变化.重建索引后,碎片下降到0.02%左右,但在一两个小时内,它会跳到50%-60%之间.

  • 页面丰满度 - 52.95%
  • 碎片总数 - 54.19%
  • 平均行数 - 338
  • 深度 - 3
  • 转发记录 - 0
  • 鬼记录 - 0
  • 索引类型 - CLUSTERED INDEX
  • 叶级行 - 134900
  • 最大行数 - 604
  • 最小行数 - 239
  • 页数 - 10736
  • 分区ID - 1
  • 版本鬼行 - 0

我不确定碎片是否导致问题,但我完全不知道为什么它可能如此迅速地碎片化.谁能解释一下?

Mih*_*riu 2

  • 您可以看到许多分段技术的差异,并了解哪种技术最适合您的情况。

  • 填充因子也会影响碎片。

  • 该表上的统计信息可能不会更新

  • 您可能是参数嗅探问题的受害者(查询计划已缓存,但不是最优的)。您能否检查这两种情况是否使用相同的查询计划?

  • 您确定这两个查询相同吗?如果不是,有什么区别?

如果您在查询运行良好或运行不佳时将来自sys.dm_db_index_physical_stats的碎片信息打印到屏幕上,我们可能会为您提供更多帮助。

稍后编辑: 使用默认填充因子,当发生页面拆分时,一半行保留在初始页面中,另一半将移动到新页面。

您几乎没有进行任何更改,但页面数量肯定会增加一倍,因此我怀疑由于 53% 的内部碎片,对表中的所有(或几乎所有)行进行了“小更新”。

其他要执行的操作:

  • 1/发布你的表结构,看看会很有用。
  • 2/ 您是否有 CHAR 数据类型的列?
  • 3/ 列出页面中的平均行数(快与慢)
  • 4/检查涉及该表的所有存储过程/查询
  • 5/ 添加触发器并记录(在另一个表中?)在您的表上执行的操作(您可能有UPDATE TableX SET colA = colA WHERE 1=1

让我们随时了解情况。