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