我注意到一个有趣的性能变化,大约有150万个输入值。有人能给我一个很好的解释,为什么会发生这种情况?
表非常简单。它由(bigint,bigint,bigint,bool,varbinary(max))组成 我在前三个bigint上有一个pk clusered索引。我只插入布尔“true”作为数据varbinary(max)。
从那时起,表现看起来非常稳定。
图例:Y(以毫秒为单位)| X(插入10K)
我也很好奇我在图表上的持续相对较小(有时非常大)的峰值。
来自尖峰之前的实际执行计划。
传说:
环境
这是当地的。
它不共享任何资源。
它是固定大小的数据库(足以使它不扩展)。
(电脑,4核,8GB,7200rps,Win 7)。
(Sql Server 2008 R2 DC,处理器关系(核心1,2),3GB,)
答案 0 :(得分:1)
一旦时间到了,您是否检查了执行计划?该计划可能会根据统计数据而变化。由于您的数据快速增长,统计数据将发生变化,这可能会触发不同的执行计划。
嵌套循环适用于少量数据,但正如您所看到的,时间随着数量的增长而增长。然后,SQL查询优化器可能会切换到对大量数据一致的哈希或合并计划。
要快速确认此理论,请尝试禁用统计信息自动更新并再次运行测试。你不应该看到“碰撞”。
编辑:由于Falcon确认性能因统计数据而发生变化,我们可以制定下一步措施。
我猜你一个接一个插入,对吗?在这种情况下(如果你不能插入批量),你最好不要插入堆工作表,然后以规则的间隔,将行批量移动到目标表中。这是因为对于每个插入的行,SQL必须始终检查密钥重复项,外键和其他检查以及排序和拆分页面。如果你能负担得起推迟这些检查,我认为你会获得极好的插入性能。
我使用此方法进行指标记录。日志记录将进入一个没有索引,没有外键,没有检查的普通堆表。每隔十分钟,我创建一个这样的新表,然后在一个事务中使用两个“sp_rename”(快速交换)我使整个表可用于处理,新表进行日志记录。然后,您可以放心地完成所有检查,排序,拆分一次。
除此之外,我不确定如何改善你的情况。您当然需要定期更新统计信息,因为这是一般性能良好的关键。
可以尝试在这三列上使用单列标识聚簇键和另一个唯一索引,但我怀疑它会有多大帮助。
如果插入的数据不是连续的,可以尝试填充索引。这将消除过多的页面拆分和混乱和碎片。您需要定期维护填充,这可能需要关闭时间。
可能会尝试进行硬件升级。您需要确定哪个组件是瓶颈。它可能是CPU或磁盘 - 在这种情况下我最喜欢的。如果你有一个一个插入,内存不太可能。它应该很容易,如果它不是CPU(图表顶部的线),那么你的IO最有可能阻止你。尝试一些更好的控制器,更好的缓存和更快的磁盘...