【问题标题】:Is it faster to UPDATE a row, or to DELETE it and INSERT a new one?更新一行更快,还是删除它并插入一个新行更快?
【发布时间】:2010-10-09 03:46:08
【问题描述】:

鉴于 SQL Server 2008/2005 上的两个场景 - 1 表有 5 行 2 表有 100 万行

如果我们需要更新几行,什么是高效的,为什么? 1)更新所需的列 2)删除行并使用更新的信息插入新行

【问题讨论】:

  • 如果你只需要更新几行,我认为性能不如你需要更新所有 100 万行那么重要。
  • 我更新了问题,提到我理想的目标是 SQL 2005/2008。
  • 想想你在问什么 - 做两个操作比一个快吗?要删除一个记录,它需要从数据块和任何关联的索引块中删除它。插入必须做相反的事情。更新被优化为尽可能少地就地更新,仅在索引列发生更改时才触及索引。所以简而言之,更新速度要快得多。
  • 如果你有参照完整性怎么办?您将无法删除行并重新插入它们!

标签: sql sql-server sql-server-2005 performance sql-server-2008


【解决方案1】:

你不应该问这个问题。您是在问“以某种‘更快’的模糊概念的名义,以正确的方式还是错误的方式更好?”

您的应用程序是否太慢了?您是否出于某种原因认为问题是因为您的更新花费了太长时间?您是否对数据库交互的性能进行过任何测量和基准测试?

您正在做的是最糟糕的过早优化,这样做是在损害您的应用程序。您正在疯狂猜测如何加速您的代码,完全没有任何依据。

正确编写代码。然后试着找出你有性能问题的地方。你甚至有性能问题,或者你问这个问题仅仅是因为你认为这是你应该问的问题?你不应该。

即使您确实对您的 UPDATE 太慢有疑问,我们也无法回答“X 是否比 Y 快”的问题,因为您没有向我们提供足够的信息,例如:

  • 您使用的是什么数据库
  • 表格布局
  • 数据库上有哪些索引
  • 您如何与数据库交互

请正确编写您的代码,然后返回有关太慢的细节,而不是猜测微优化。

【讨论】:

  • 积分不错。嗯,这个问题是我在一家公司面试时被问到的问题之一。我自己被这个意想不到的问题吓了一跳,我给了他们我的想法和理由。想在这里分享这个问题,以防我发现我之前可能忽略的任何新维度。感谢您在这个问题上的宝贵时间。
  • 什么是实现语义的首选方式:“我希望数据库只包含一条 PK 为 xxx 的记录,以及指定的一些特定列,如果没有记录,则将剩余列设置为特定值存在,但如果存在则不要管它们”?执行可能失败的插入(重复键)并在插入失败时执行更新,以某种方式尝试使用一个 SQL 事务进行插入和更新,执行 SELECT 以查看记录是否存在,如果不存在则执行插入(希望没有人能胜过我到它)并以其他方式更新,还是什么?假设记录将存在 99% 的时间。
  • 尝试选择记录。如果它在那里,请更新现有的。如果没有,请插入一个新的。
  • 你是不是很骚!
【解决方案2】:

通常更新单行会更快。原因是删除现有行并插入新行,这两个操作都会影响聚集索引。更新单行也会影响各种索引,但不会影响聚集索引。没有数据点支持我的主张,但从逻辑上讲,数据库引擎应该以这种方式运行。

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2021-09-21
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    相关资源
    最近更新 更多