SQL Server索引 - 创建后的初始性能降低

时间:2010-01-14 23:05:17

标签: sql-server-2005 performance indexing

使用SQL Server 2005.这是我在做一些性能分析时注意到的事情。

我有一个大约1亿行的大表。我正在比较表上不同索引的性能,看看对于我的测试场景最优化的是什么,在该表上执行大约10,000次插入,以及其他表上的其他操作。我的测试正在运行时,我正在捕获一个SQL事件探查器跟踪,我在测试完成后将其加载到SQL表中,以便我可以分析统计信息。

在表上重新创建一组不同的索引之后的第一次测试运行速度明显慢于后续运行 - 通常在创建索引后第一次运行时此表上的插入速度慢大约10-15倍。

每次,我都会在测试前清除数据和执行计划缓存。

我想知道的是,新创建的索引集合初始性能较差的原因是什么? 有没有办法可以监控第一次运行时发生的情况?

2 个答案:

答案 0 :(得分:4)

一种可能性是默认的fill factor为零。

这意味着索引中没有“空间”来容纳您的插入内容。插入时,需要在索引中拆分页面,这会添加一些空白空间来存储新的索引信息。当您执行更多插入时,索引中会创建更多空间。一段时间之后,拆分速率会下降,因为您的插入符击的是未完全填充的页面,因此不需要拆分。需要页面拆分的插件比不插页的插件更昂贵。

您可以在创建索引时设置填充因子。它是在使用空间和不同操作性能之间的经典折衷。

我要去包含一些Sybase ASE docs的链接,因为它们编写得很好,大部分也适用于SQL Server。

答案 1 :(得分:1)

只是为了澄清:

1)您在具有100米预先存在的行的表上构建索引。

2)您在表格中插入10k行

3)在表格中插入另外10k行

第3步比第2步快10倍?

新索引是什么类型的索引 - 没有聚集,对吧?因为聚簇索引上的插入会导致非常不同的行为。此外,2个插入的配置文件是否存在任何显着差异,因为根据聚簇索引,它们将具有不同的行为。通常,它应该没有聚簇索引或者在增加的密钥上聚集。