2008-09-03 25 views
17

我有一个超过一个毫秒行的表。该表用于索引tiff图像。每个图像都有像date,number等字段。我有用户可以批量索引这些图像500.我需要知道是否最好先插入500行,然后执行500次更新,或者当用户完成索引时,做500个插入所有数据。一个非常重要的事情是,如果我一开始就做500个插入,这次对我来说是免费的,因为我可以在前一天晚上做到这一点。插入成本vs SQL Server中的更新

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

回答

25

Sql服务器中的更新导致幻影行 - 即Sql跨过一行并放入一个新行。划掉的行在稍后删除。

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

在此更新的基础上,需要先查看行,这对于大量数据来说可能需要比更新更长的时间。

插入将几乎总是更快,特别是如果他们要么顺序或如果基础表没有聚集索引。

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

你可以认为它像追加到地址簿位:Z先生刚好可以加入到最后一页,当你必须找到中间为M.先生

1

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

+0

乔瓦尼空间,它也将取决于其他问题,如索引(聚簇或非聚簇)和填充因子。你的具体情况将在很大程度上影响你的进展。 – Galwegian 2008-09-03 14:59:52

2

先做插入,然后更新似乎是一个更好的主意有几个原因。您将在低交易量时插入。由于插入的数据更多,现在是更好的时机。

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

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

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

1

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

1

这不是一个枯燥的问题。奎师那和Galegian的观点是现货。

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

1

我认为插入会运行得更快。他们不需要查找(当你做一个更新时,你基本上是用where子句做相当于select的选择)。另外,插入操作不会像更新那样锁定行,所以它不会干扰同时发生在表上的任何选择。