SQL Server中插入与更新的成本

时间:2008-09-03 14:47:52

标签: sql-server performance

我有一张超过一百万行的表。此表用于索引tiff图像。每个图像都有datenumber等字段。我有用户将这些图像分批编入500个。我需要知道首先插入500行然后再执行500次更新是否更好,当用户完成索引时,使用所有数据执行500次插入。一个非常重要的事情是,如果我最初做500个插页,这个时间对我来说是免费的,因为我可以在前一天晚上做。

所以问题是:插入或插入更新是否更好,为什么?我为每个图像定义了一个id值,并且我在字段上也有其他索引。

6 个答案:

答案 0 :(得分:32)

Sql server中的更新导致幻影行 - 即Sql跨越一行并放入新行。划掉的行将在以后删除。

插入和更新都会以这种方式导致页面拆分,它们都有效地“添加”数据,只是更新标记旧的东西。

除此之外,还需要首先查找行,这对于大量数据来说可能需要比更新更长的时间。

插入将总是更快,特别是如果它们是有序的或基础表没有聚集索引。

当将大量数据插入表中时,查看当前索引 - 它们可能需要一段时间才能更改和构建。在索引中间添加值总是较慢。

您可以将其视为附加到地址簿:Z先生可以添加到最后一页,而您必须在M的中间找到空间。

答案 1 :(得分:2)

首先进行插入,然后由于多种原因,更新似乎更好。您将在交易量较低的时候插入。由于插入包含更多数据,因此这是更好的时间。

由于您正在使用更新的id值(可能是索引),因此更新的开销将非常低。在更新期间,您的数据也会减少。

您还可以关闭批处理(500插入/更新)级别的事务,并将其用于每个单独的记录,从而减少一些开销。

最后,在做出最终决定之前,先测试一下,看看服务器上的实际性能。

答案 2 :(得分:1)

我不是数据库人,但我想一次插入会更快,因为更新需要查找,而插入则不行。

答案 3 :(得分:1)

每个查询的执行计划都会告诉您哪一个应该更贵。真正的限制因素是写入磁盘,因此您可能需要在运行perfmon时运行一些测试,以查看哪个查询导致更多写入并导致磁盘队列获得最长时间(更长时间是坏的)。

答案 4 :(得分:1)

这不是一个简单而干燥的问题。克里希纳和加莱吉安的观点都在现场。

对于更新,如果更新影响固定长度字段,则影响将会减轻。如果更新varchar或blob字段,则在新值超过旧值的长度时,可能会在更新期间添加页面拆分成本。

答案 5 :(得分:1)

我认为插入会运行得更快。它们不需要查找(当您进行更新时,您基本上使用where子句执行相当于select的操作)。而且,插入不会像更新那样锁定行,因此它不会干扰同时针对表发生的任何选择。