【问题标题】:What are the advantages of MERGE over simple IF EXISTS?与简单的 IF EXISTS 相比,MERGE 的优势是什么?
【发布时间】:2013-06-16 10:49:47
【问题描述】:

我想知道与简单地使用 IF EXISTS 相比,MERGE 的优势是什么。建议的方法是什么? MERGE 是否执行逐行更新和插入匹配条件?如果是,是否类似于 Cursors?

【问题讨论】:

  • 我真的不认为有;实际上有几个缺点恕我直言,@ 987654321@。
  • @AaronBertrand 。 . .完全巧合的是,我正要在一些代码中编写一个合并语句。阅读您的帖子和相关帖子后,我将坚持使用if exists 表格。至少竞争条件会很明显(而且不是大容量,并发问题不太可能)。谢谢。

标签: sql-server sql-server-2008


【解决方案1】:

MERGE 将 INSERT、UPDATE 和 DELETE 逻辑组合到一个 DML 语句中,因此是原子的。如果您正在执行单行 UPSERTS,那么优势就不那么明显了。例如,一个简单的 UPSERT 实现可能如下所示:

IF  EXISTS (SELECT * FROM t1 where id=@id)
    UPDATE t1 SET ... WHERE id=@id
ELSE
    INSERT INTO t1 (...) VALUES (...)

但是,如果不将其包装在事务中,我们将要更新的行可能会在 SELECT 和 UPDATE 之间被删除。添加最少的逻辑来解决这个问题给了我们这个:

BEGIN TRAN
IF  EXISTS (SELECT * FROM t1 WITH (HOLDLOCK, UPDLOCK) where id=@id )
    UPDATE t1 SET ... WHERE id=@id
ELSE
    INSERT INTO t1 (...) VALUES (...)
COMMIT

MERGE 语句不需要此逻辑。

在 CURSORS 和 MERGE 语句之间不需要进行比较。

【讨论】:

  • 好吧,小心那个承诺:它只是具有特定提示或隔离级别的原子。默认it behaves like separate statements.
  • 从链接中引用“仍然需要 HOLDLOCK 提示,因为 MERGE 否则会在插入之前释放更新键锁”。所以所有 MERGE 需要的是一个 HOLDLOCK。
【解决方案2】:

Merge 将为您提供更新、插入和删除目标表中与源表匹配的数据的选项。它是基于集合的操作,所以不像游标(逐行)

我不确定您所说的优于“如果存在”的优势是什么意思,但合并是同步 2 个表的一种有用且灵活的方式

这是合并https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/的有用资源

【讨论】:

猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多