Sql Server 2008 R2 DC插入性能变化

时间:2011-09-13 09:27:08

标签: sql-server sql-server-2008 sql-server-2008-r2 performance-testing sql-server-performance

我注意到一个有趣的性能变化,大约有150万个输入值。有人能给我一个很好的解释,为什么会发生这种情况?

表非常简单。它由(bigint,bigint,bigint,bool,varbinary(max))组成 我在前三个bigint上有一个pk clusered索引。我只插入布尔“true”作为数据varbinary(max)。

从那时起,表现看起来非常稳定。

图例:Y(以毫秒为单位)| X(插入10K)

enter image description here

我也很好奇我在图表上的持续相对较小(有时非常大)的峰值。

来自尖峰之前的实际执行计划。

Actual Execution Plan from before spikes

传说:
表I插入到:TSMDataTable
1. BigInt DataNodeID - fk
2. BigInt TS - 主要时间安排
3. BigInt CTS - 修改时间戳
4.位:ICT - 保留最后插入值的记录(提高读取性能)
5.数据:数据
Bool值当前时间戳保持

环境
这是当地的。
它不共享任何资源。
它是固定大小的数据库(足以使它不扩展)。
(电脑,4核,8GB,7200rps,Win 7)。
(Sql Server 2008 R2 DC,处理器关系(核心1,2),3GB,)

1 个答案:

答案 0 :(得分:1)

一旦时间到了,您是否检查了执行计划?该计划可能会根据统计数据而变化。由于您的数据快速增长,统计数据将发生变化,这可能会触发不同的执行计划。

嵌套循环适用于少量数据,但正如您所看到的,时间随着数量的增长而增长。然后,SQL查询优化器可能会切换到对大量数据一致的哈希或合并计划。

要快速确认此理论,请尝试禁用统计信息自动更新并再次运行测试。你不应该看到“碰撞”。

编辑:由于Falcon确认性能因统计数据而发生变化,我们可以制定下一步措施。

我猜你一个接一个插入,对吗?在这种情况下(如果你不能插入批量),你最好不要插入堆工作表,然后以规则的间隔,将行批量移动到目标表中。这是因为对于每个插入的行,SQL必须始终检查密钥重复项,外键和其他检查以及排序和拆分页面。如果你能负担得起推迟这些检查,我认为你会获得极好的插入性能。

我使用此方法进行指标记录。日志记录将进入一个没有索引,没有外键,没有检查的普通堆表。每隔十分钟,我创建一个这样的新表,然后在一个事务中使用两个“sp_rename”(快速交换)我使整个表可用于处理,新表进行日志记录。然后,您可以放心地完成所有检查,排序,拆分一次。

除此之外,我不确定如何改善你的情况。您当然需要定期更新统计信息,因为这是一般性能良好的关键。

可以尝试在这三列上使用单列标识聚簇键和另一个唯一索引,但我怀疑它会有多大帮助。

如果插入的数据不是连续的,可以尝试填充索引。这将消除过多的页面拆分和混乱和碎片。您需要定期维护填充,这可能需要关闭时间。

可能会尝试进行硬件升级。您需要确定哪个组件是瓶颈。它可能是CPU或磁盘 - 在这种情况下我最喜欢的。如果你有一个一个插入,内存不太可能。它应该很容易,如果它不是CPU(图表顶部的线),那么你的IO最有可能阻止你。尝试一些更好的控制器,更好的缓存和更快的磁盘...