Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL合并是如何工作的?针对更新和插入的性能_Sql_Sql Server_Performance_Tsql_Sql Server 2012 - Fatal编程技术网

TSQL合并是如何工作的?针对更新和插入的性能

TSQL合并是如何工作的?针对更新和插入的性能,sql,sql-server,performance,tsql,sql-server-2012,Sql,Sql Server,Performance,Tsql,Sql Server 2012,有人能帮我理解TSQL合并实际上是如何工作的吗?并帮助我了解何时更新/插入速度更快,何时合并速度更快 我知道这是一个非常模糊的问题,与我正在处理的一个特定案例无关。希望这在StackOverflow上是允许的 如果你能给我相关的链接,将工作以及。谢谢 谢谢你给我指出: 但我觉得这与索引的关系更密切,因此我的问题与此无关。合并实现在源和目标上进行了完全外部连接。根据您指定的副作用子句,可以将其简化为更容易的联接,例如左联接或内联接 从连接结果中,有计算标量运算符,用于计算应该发生的操作以及要使用的

有人能帮我理解TSQL合并实际上是如何工作的吗?并帮助我了解何时更新/插入速度更快,何时合并速度更快

我知道这是一个非常模糊的问题,与我正在处理的一个特定案例无关。希望这在StackOverflow上是允许的

如果你能给我相关的链接,将工作以及。谢谢

谢谢你给我指出:
但我觉得这与索引的关系更密切,因此我的问题与此无关。

合并实现在源和目标上进行了
完全外部连接。根据您指定的副作用子句,可以将其简化为更容易的联接,例如左联接或内联接

从连接结果中,有计算标量运算符,用于计算应该发生的操作以及要使用的值。该结果流式传输到执行写入操作的运算符中

这是非常简单的。如果只指定一个side-effecting子句,则与普通DML的差异几乎为零。这表明merge没有固有的性能缺点

事实上,它有一个优势,即它只需要传递一次数据。通常,merge比多个语句做同一件事要快

  • 优化器可以一次看到所有DML
  • 对数据进行一次传递,而不是对每条语句进行一次传递
  • 所有索引写入都按索引键排序。最好只做一次而不是多次
  • 每语句开销只有一次
如果您以一种不受益于上述任何一点的方式使用merge,那么它可以使用更多的CPU


性能实际上取决于模式、合并的形状和数据。我可以构造合并稍微慢一点的情况,以及合并速度明显快一点的情况。

可能重复的合并会有开销,因为会有一些线程在执行它。但归根结底,它使开发人员的生活变得多么方便。确切地说,它使我编写查询的生活变得更加轻松。我在数据库中没有太多的行,我正在处理大约一百万行。我无法决定是否应该将其更改为更新和插入。我不是专家,但我猜如果您使用“合并”来更新或删除,无论发生什么情况,这些都会发生,因为那里没有火箭科学。并不是说合并会使插入或更新更有效。显然,编译器首先必须经过merge构造,理解它在说什么,然后执行操作。因此,省略合并将使代码更快,无论它多么微小。但我之所以不关心这一点,是因为合并允许我更好地维护和扩展代码。很抱歉,我没有这方面的任何资源,请尝试谷歌搜索。@Mithrandir-如果你仔细看,这个问题的公认答案并没有说明
MERGE
的性能,而是说明了代码的总体性能。我不认为这是重复的,但对于这个问题,SO并不是最好的平台。所以,基本上类似于一个微小的ETL操作。非常有效的分数!