T-SQL MERGE - 为什么?

时间:2011-04-24 00:10:42

标签: database performance tsql

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

我正在考虑的一个声明是MERGE,Microsoft docs here

有理由使用它吗?是否有一个性能优势或其他一些你已经发现的东西可以证明它比标准SQL + IF或者两个{{1}}更合理?

3 个答案:

答案 0 :(得分:5)

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

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

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

更好的解决方案是使用insert和update语句(在我的情况下不需要删除)。但这样做通常需要临时表,表参数或临时表。我讨厌使用这三个并尽可能地避开它们。

MERGE语句很好,因为我可以执行插入和更新,同时只需要提取源数据一次。语法看起来很疯狂,但在你写完一些内容之后一点也不差。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

据我所知,它更“方便”,但不要引用我的话。