Fal*_*con 7 sql-server performance-testing sql-server-2008 sql-server-2008-r2 sql-server-performance
我注意到一个有趣的性能变化,大约有150万个输入值.有人能给我一个很好的解释,为什么会这样?
表非常简单.它由(bigint,bigint,bigint,bool,varbinary(max))组成.我在前三个bigint上有一个pk clusered索引.我只插入布尔"true"作为数据varbinary(max).
从那时起,表现似乎非常稳定.
图例:Y(以毫秒为单位)| X(插入10K)

我也很好奇我在图上有不断的相对较小(有时非常大)的峰值.
来自尖峰之前的实际执行计划.

图例:
我插入的表:TSMDataTable
1. BigInt DataNodeID - fk
2. BigInt TS - 主
时间戳3.BigInt CTS - 修改时间戳
4.位:ICT - 保留最后插入值的记录(提高读取性能)
5.数据: Data
Bool值当前时间戳保持不变
环境
它是本地的.
它不共享任何资源.
它是固定大小的数据库(足以使它不扩展).
(电脑,4核,8GB,7200rps,Win 7).
(Sql Server 2008 R2 DC,处理器亲和力(核心1,2),3GB,)
时间一到,你检查过执行计划吗?该计划可能会根据统计数据而改变。由于您的数据增长很快,统计数据会发生变化,这可能会触发不同的执行计划。
嵌套循环适用于少量数据,但正如您所看到的,时间随着数据量的增加而增长。然后,SQL 查询优化器可能会切换到对于大量数据而言一致的散列或合并计划。
要快速证实这一理论,请尝试禁用统计信息自动更新并再次运行测试。那么你不应该看到“凹凸”。
编辑:由于 Falcon 确认性能因统计数据而发生变化,我们可以制定后续步骤。
我猜你是一一插入的,对吗?在这种情况下(如果无法批量插入),最好插入堆工作表,然后定期将行批量移动到目标表中。这是因为对于每个插入的行,SQL 必须始终检查键重复、外键和其他检查以及排序和拆分页面。如果您可以推迟这些检查一段时间,我认为您将获得出色的插入性能。
我使用这种方法来记录指标。日志记录将进入一个普通的堆表,没有索引、没有外键、没有检查。每隔十分钟,我创建一个此类新表,然后在事务中使用两个“sp_rename”(快速交换),使整个表可用于处理,并且新表进行日志记录。然后,您可以轻松地批量执行所有检查、排序、拆分操作一次。
除此之外,我不知道如何改善你的情况。您当然需要定期更新统计数据,因为这是总体良好性能的关键。
可能会尝试在这三列上使用单列标识聚集键和附加唯一索引,但我怀疑这会有多大帮助。
如果您插入的数据不是连续的,可以尝试填充索引。这将消除过多的页面分割、改组和碎片。您需要定期维护填充物,这可能需要休息时间。
可能会尝试对其进行硬件升级。您需要找出哪个组件是瓶颈。它可能是 CPU 或磁盘 - 在这种情况下我最喜欢。恕我直言,如果你有一张一张的插入,记忆不太可能。那么这应该很容易,如果不是 CPU(挂在图表顶部的线)那么很可能是您的 IO 阻碍了您。尝试一些更好的控制器、更好的缓存和更快的磁盘......