23

我有一张超过一百万行的桌子。该表用于索引tiff图像。每个图像都有诸如date,number等字段。我有用户以 500 个批次为这些图像编制索引。我需要知道首先插入 500 行然后执行 500 次更新是否更好,或者当用户完成索引时执行包含所有数据的 500 次插入。一个非常重要的事情是,如果我一开始做 500 次插入,这次对我来说是免费的,因为我可以在前一天晚上做。

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

4

6 回答 6

37

Sql server 中的更新会导致出现幻影行 - 即 Sql 将一行划掉并放入一个新行。划掉的行稍后会被删除。

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

最重要的是,更新需要首先查找行,对于大量数据,这可能比更新花费更长的时间。

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

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

你可以把它想象成附加到地址簿:Z先生可以添加到最后一页,而你必须在中间为M先生找到空间。

于 2008-09-03T15:13:04.523 回答
2

首先进行插入然后进行更新似乎是一个更好的主意,原因有几个。您将在交易量较低的时候插入。由于插入具有更多数据,因此这是执行此操作的更好时机。

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

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

最后,在做出最终决定之前对其进行测试以查看服务器上的实际性能。

于 2008-09-03T15:00:12.760 回答
2

这不是一个简单明了的问题。Krishna 和Galegian 的观点是正确的。

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

于 2008-09-03T15:08:01.760 回答
2

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

于 2008-09-03T15:12:29.033 回答
1

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

于 2008-09-03T15:03:39.210 回答
0

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

于 2008-09-03T14:54:33.803 回答