【问题标题】:Join between two tables with business logic on billion rows在具有十亿行业务逻辑的两个表之间连接
【发布时间】:2012-12-23 07:36:24
【问题描述】:

我有像这样的源表和表目标表

Source:

    Column1 Column2 Column3 Column4

Destination:

    Column1 Column2 Column5 Column6

如何在 SQL SERVER 中实现这个逻辑

IF SOURCE.Column1 = DESTINATION.Column1 AND SOURCE.Column2 = DESTINATION.Column2
UPDATE DESTINATION Column5 = SOURCE.Column1 + 12 (some other logic)
ELSE
Do something else

问题是,我必须处理十亿行,那么实现上述逻辑的最佳方法是什么

EDIT1

IF SOURCE.Column1 = DESTINATION.Column1 AND SOURCE.Column2 = DESTINATION.Column2
UPDATE DESTINATION Column5 = SOURCE.Column1 + 12 (some other logic)
ELSE
**INSERT SOURCE table row to the destination**

如何使用合并语句实现相同的功能,因为我只需要考虑两列

【问题讨论】:

  • 更让您头疼的是,如果您要更新数十亿行,您需要考虑的另一个问题是可用性。你能负担得起关闭数据库(单用户)来执行更改吗?请注意,当您像这样运行大规模更新时,对您的应用程序响应时间的影响将是巨大的,并且可能需要数小时。如果您可以使数据库脱机,那就太好了;如果没有,那么您需要弄清楚某种“批处理”。
  • @JosephLess 感谢您的建议,值得考虑。但由于所有 OLAP 多维数据集和报表都链接到数据库,我无法关闭数据库。
  • @Zerotoinfinite 如果有 10 亿行或者你不能有停机时间 - 查看蚕食更新(stackoverflow.com/questions/2082751 是一个例子)。随着十亿行的单次更新,您的事务日志会发疯,锁定也会伤害所有其他用户。

标签: sql sql-server sql-server-2008 join sql-update


【解决方案1】:

您可以将UPDATEJOIN 一起使用,这在您的情况下会更明智。像这样:

UPDATE d
SET d.Column5 = CASE WHEN some logic THEN s.Column1 + 12 (some other logic)
                     ELSE Something else
                ELSE
FROM DESTINATION d
LEFT JOIN SOURCE s ON s.Column2 = d.Colcumn2;


您可以像这样使用MERGE 语句:

MERGE INTO SOURCE AS TGT
USING DESTINATION AS SRC
  ON TGT.Column1 = SRC.Column1 
WHEN MATCHED THEN
  UPDATE SET
    TGT.Column5 = SRC.Column1 + 12 (some other logic)
WHEN NOT MATCHED THEN
  INSERT (Source columns list)
  VALUES (...);

请注意:

  • INSERT 语句中没有INTO TableName,因为目标表的名称已经在MERGE 子句中定义,即SOURCE。这就是我定义SOURCE AS TGTDESTINATION AS SRC 的原因。

  • MERGE 语句必须以分号结束。最好使用所有 sql 语句来执行此操作。

【讨论】:

  • 您可以使用CASE 表达式包含ELSE 部分。查看我的编辑。
  • 感谢您的回答,我正在努力解决这个问题,但我现在在问题的编辑部分提到了一个问题。
  • 我已经写了这个但是我收到错误 MERGE DESTINATIONTable AS DST USING SourceTable AS SRC ON DST.Column1 = SRC.Column1 AND DST.Column2 = SRC.Column2 WHEN MATCHED THEN SELECT 1 WHEN NOT MATCHED THEN选择 2
  • @Zerotoinfinite 我发布的查询中没有SELECT 子句。请您告诉我您使用的确切查询。
猜你喜欢
  • 2013-04-26
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多