【问题标题】:SQL Server Performance: Delete/Insert Vs Select/UpdateSQL Server 性能:删除/插入与选择/更新
【发布时间】:2011-10-10 15:02:21
【问题描述】:

我有一个非常大的数据库,只有 60 多个演出,其中包含许多具有数百万行的表。我遇到了一些超时错误,所以我正在重新考虑我的一些代码设计。

目前,我的伪代码是这样的:

从 person=123 的表中删除(删除大约 200 行)

然后我重新插入更新后的数据(同样是 200 行)。数据总是不同的,因为它是时间敏感的。

如果我要进行更新,而不是插入,我必须先选择行(我在 c# 中使用 ORM)。

tl;博士 我只是想知道,简单的问题,什么更划算。 选择/更新或删除/插入?

【问题讨论】:

  • 您是否想过不使用 ORM 而是使用普通的 ADO.NET 来完成这项任务?
  • 什么是表结构?您是否正在更新集群密钥?
  • 啊 - 60 gig 不是 vldb。那是…… 15 年前。今天它是平庸的。
  • 你使用的是哪个 ORM?
  • 我想继续使用 ORM(亚音速)。我喜欢保持整洁。

标签: sql-server performance


【解决方案1】:
  1. 如果您更新任何属于聚集索引键的列,那么您的更新将在内部作为删除/插入进行处理

  2. 您将如何使用 UPDATE 处理基数差异? IE。 person=123 有 200 行要删除,但只有 199 行要插入。更新将无法处理此问题。

您最好的方法应该是使用 MERGE 语句和带有新值的 table valued parameter。当然,没有ORM可以处理这个,但是你提到'performance',并且'performance'和'ORM'这两个术语不能在同一个句子中使用......

【讨论】:

    【解决方案2】:

    使用删除/插入,您将写入数据库两次。一次删除,一次插入。您还将分别记录这两个事务,除非您将整个过程正确地包装在一个事务中。

    您可以测试这两种方法并在 SQL Profiler 中观察结果,但 9/10 更新会更快。

    请注意,我会确保对 person 键进行索引,这样您就不会进行完整的表扫描来查找受影响的记录。

    最后,正如@Mundu 所说,您可能希望通过 ADO.NET 而不是 ORM 使用参数化查询来执行此操作。

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2019-04-09
      • 2014-09-11
      • 2012-03-31
      • 1970-01-01
      • 2019-08-10
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多