2011-04-24 39 views
2

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

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

是否有使用它的理由?是否有性能优势或其他您认为可以证明其在标准SQL + IF或两者中使用的其他优点?

+2

“我不愿意在SQL中使用特定于供应商的语法” - 这是你决定的 – 2011-04-24 00:19:46

+1

如果没有理由使用它,你不会问这个问题。我认为你的回答可以在你的问题中找到......如果你的目标是保留其他供应商可以轻松实现的选项,请不要使用任何特定供应商。 – Mikecito 2011-04-24 00:25:28

+1

我相信他在问,因为除非有性能提升,否则他宁可不使用MERGE。 – 2011-04-24 00:35:49

回答

5

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

我有一个应用程序使用数据库从另一台服务器每隔30分钟提取更新的清单信息。

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

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

MERGE语句很好,因为我可以执行插入和更新,而只需要拉取源数据一次。语法看起来很疯狂,但是在你写了几句之后,它一点都不差。

就不想使用供应商特定的语法的评论,以及我只是不能看到这种方式。我没有看到太多不是特定于供应商的东西。当然,MERGE与其他数据库中的MERGE有很大不同,它可能很突出。然而,并不是任何事物都从一个平台移动到另一个平台,没有任何一件事情都绝对会突破每一个重要的方式,反而更容易从头开始。那么,至少这是我个人的经历。每种数据库类型,MS SQL,MySQL,Oracle,DB2,Informix等等......它们都有自己特殊的语法规则(比如SELECT TOP 1在每个似乎不同的数据库中都是不同的),函数,优化技术等等。这不像是一个MERGE,在这些转换中会有什么会杀死你,你在处理重写MERGE语句之前就已经很长时间了。

+1

+1最后一段 – 2011-04-26 02:19:24

+1

我可能会误解,但我相信MERGE是ANSI标准的一部分,尽管没有多少供应商支持它。 upsert/replace语法的其他变体不是。 – TheXenocide 2013-11-20 14:50:26

0

据我的理解,这只是更“方便”,但不要在此引用我的意思。

1

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

但是,如果您不想使用MERGE,请不要使用它。我已经看到了足够多的项目,其中只需要花费时间重写从T-SQL到PL/SQL的存储过程,因为有人告诉客户,昂贵的Oracle是其50次点击/天网站的“更多企业解决方案”。

+0

此外做一个'upsert'没有竞争条件是很容易得到错误。 – 2011-04-25 11:29:04

相关问题