【问题标题】:T-SQL MERGE - Why? [closed]T-SQL 合并 - 为什么? [关闭]
【发布时间】:2011-08-11 16:30:29
【问题描述】:

我不愿意在 SQL 中使用供应商特定的语法,因为我宁愿让我们开发的解决方案与平台无关,包括不绑定到关系数据库平台,因为我们喝了 Kool-Aid 并开始使用不支持的扩展在竞争供应商平台上并不总是有明确的替代品。

我正在考虑的这样一个声明是MERGE,Microsoft 文档here

有使用它的理由吗?是否有性能优势或其他你们都发现的东西来证明它比标准 SQL + IF 或两个的使用是合理的?

【问题讨论】:

  • “我不愿意在 SQL 中使用特定于供应商的语法”——由您决定
  • 如果没有理由使用它,你就不会问这个问题。我认为您的答案已在您的问题中找到......如果您的目标是保留其他供应商可以轻松实现的选项,请不要使用任何特定于供应商的选项。
  • 我相信他在问,因为他宁愿不使用 MERGE,除非有性能提升。
  • MERGE 是一个 ANSI SQL:2003 标准 命令 - 它不是无论如何都是特定于供应商的
  • 这是使用合并的原因之一。 stackoverflow.com/questions/5365629/…

标签: database performance tsql


【解决方案1】:

我喜欢使用合并,因为它将所有内容放在一起并限制了临时表或临时表的使用。

我有一个使用数据库的应用程序,该数据库每 30 分钟从另一台服务器获取更新的库存信息。

最简单(最不复杂)的解决方案是删除现有数据,然后重新填充整个表。这很糟糕有几个原因。最大的一些是用户可以在此删除和插入之间查看报告并且没有数据,如果数据提取出现问题,那么我已经丢失了所有数据,当我只需要更新时,我正在更新 250,000 条记录5,000 左右。

更好的解决方案是使用插入和更新语句(在我的情况下不需要删除)。但这样做通常需要一个临时表、表参数或临时表。我讨厌使用所有这三种方法,并尽可能避免使用它们。

MERGE 语句很好,因为我可以执行插入和更新,而只需要提取一次源数据。语法看起来很牛逼,但写了几句就一点也不差了。

关于不想使用特定于供应商的语法的评论,我只是不这么看。我看不到很多不是特定于供应商的。当然,MERGE 与其他数据库中的非常不同,它可能会脱颖而出。然而,并不是任何东西都从一个平台转移到另一个平台,而每一件事情都绝对会以各种重要的方式打破,这只会让从头开始变得更容易。好吧,这至少是我的个人经历。每种数据库类型,MS SQL、MySQL、Oracle、DB2、Informix 等......它们都有自己特殊的语法规则(就像 SELECT TOP 1 在每个看起来很糟糕的数据库中都不同)、函数、优化技术等等.它不像这里的 MERGE,在这些转换中会有什么会杀死你,在你处理重写 MERGE 语句之前,你就会死掉很久。

【讨论】:

  • 我可能弄错了,但我相信 MERGE 是 ANSI 标准的一部分,尽管没有多少供应商支持它。 upsert/replace 语法的其他变体不是。
【解决方案2】:

看来您必须在标准 SQL 中执行 2 次查询才能实现 MERGE 的功能。所以可能会更慢,而且肯定更难写。

但可以肯定的是,如果您不想使用 MERGE,请不要使用它。我已经看到足够多的项目花费时间将存储过程从 T-SQL 重写为 PL/SQL,只是因为有人告诉客户,对于他们每天 50 次点击的网站来说,昂贵的 Oracle 是一个“更具企业性的解决方案”。

【讨论】:

  • 另外做一个没有竞争条件的upsert 很容易出错。
【解决方案3】:

据我了解,它只是更“方便”,但不要引用我的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2011-04-09
    • 1970-01-01
    • 2016-08-23
    • 2015-12-06
    • 2015-07-18
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多