SQL Server中的插入成本与更新成本

时间:2020-03-05 18:47:04  来源:igfitidea点击:

我的桌子上有不止一毫米的行。该表用于索引" tiff"图像。每个图像都有"日期","编号"等字段。我有用户以500为批次对这些图像进行索引。我需要知道最好先插入500行然后执行500次更新,或者何时使用用户完成索引,对所有数据进行500次插入。一个非常重要的事情是,如果我一开始做500次插入,这次对我来说是免费的,因为我可以在前一天晚上做。

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

解决方案

回答

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

回答

出于以下几个原因,先进行插入然后进行更新似乎是一个更好的主意。我们将在交易量较低时进行插入。由于插入内容包含更多数据,因此这是一个更好的时机。

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

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

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

回答

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

回答

这不是一个简单的问题。克里希纳(Krishna)和加里吉安(Galegian)的观点很明显。

对于更新,如果更新影响定长字段,则影响会减小。如果更新varchar或者blob字段,则当新值超过旧值的长度时,我们可能会在更新期间增加页面拆分的开销。

回答

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

回答

Sql服务器中的更新会导致幻影的行,即Sql删除一行并放入一个新行。删除的行稍后会删除。

插入和更新都会以这种方式导致页面拆分,它们都有效地"添加"了数据,只是更新首先将旧内容标记出来。

最重要的是,此更新需要首先查找该行,因为该行的大量数据可能比更新花费更长的时间。

插入几乎总是会更快,尤其是顺序插入或者基础表没有聚簇索引时。

当向表中插入大量数据时,请查看当前索引,这些索引可能需要一段时间才能更改和构建。在索引中间添加值始终较慢。

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