我有一张超过一百万行的桌子。该表用于索引tiff
图像。每个图像都有诸如date
,number
等字段。我有用户以 500 个批次为这些图像编制索引。我需要知道首先插入 500 行然后执行 500 次更新是否更好,或者当用户完成索引时执行包含所有数据的 500 次插入。一个非常重要的事情是,如果我一开始做 500 次插入,这次对我来说是免费的,因为我可以在前一天晚上做。
所以问题是:插入还是插入和更新更好,为什么?我id
为每个图像定义了一个值,并且字段上还有其他索引。
我有一张超过一百万行的桌子。该表用于索引tiff
图像。每个图像都有诸如date
,number
等字段。我有用户以 500 个批次为这些图像编制索引。我需要知道首先插入 500 行然后执行 500 次更新是否更好,或者当用户完成索引时执行包含所有数据的 500 次插入。一个非常重要的事情是,如果我一开始做 500 次插入,这次对我来说是免费的,因为我可以在前一天晚上做。
所以问题是:插入还是插入和更新更好,为什么?我id
为每个图像定义了一个值,并且字段上还有其他索引。
Sql server 中的更新会导致出现幻影行 - 即 Sql 将一行划掉并放入一个新行。划掉的行稍后会被删除。
插入和更新都可能以这种方式导致页面拆分,它们都有效地“添加”数据,只是更新首先将旧的东西标记出来。
最重要的是,更新需要首先查找行,对于大量数据,这可能比更新花费更长的时间。
插入总是会更快,特别是如果它们是有序的或者基础表没有聚集索引。
当向表中插入大量数据时,请查看当前索引 - 它们可能需要一段时间才能更改和构建。在索引中间添加值总是比较慢。
你可以把它想象成附加到地址簿:Z先生可以添加到最后一页,而你必须在中间为M先生找到空间。
首先进行插入然后进行更新似乎是一个更好的主意,原因有几个。您将在交易量较低的时候插入。由于插入具有更多数据,因此这是执行此操作的更好时机。
由于您使用 id 值(可能是索引)进行更新,因此更新的开销将非常低。在更新期间您的数据也会更少。
您还可以在批处理(500 次插入/更新)级别关闭事务并将其用于每个单独的记录,从而减少一些开销。
最后,在做出最终决定之前对其进行测试以查看服务器上的实际性能。
这不是一个简单明了的问题。Krishna 和Galegian 的观点是正确的。
对于更新,如果更新影响固定长度的字段,则影响将减小。如果更新 varchar 或 blob 字段,当新值超过旧值的长度时,您可能会在更新期间添加页面拆分成本。
我认为插入会运行得更快。它们不需要查找(当您进行更新时,您基本上相当于使用 where 子句进行选择)。而且,插入不会像更新那样锁定行,因此它不会干扰同时针对表发生的任何选择。
每个查询的执行计划将告诉您哪个应该更昂贵。真正的限制因素是对磁盘的写入,因此您可能需要在运行 perfmon 时运行一些测试,以查看哪个查询导致更多写入并导致磁盘队列最长(越长越好)。
我不是数据库专家,但我想一次性插入会更快,因为更新需要查找,而插入不需要。