1

我的项目必须处理庞大的数据库。在最坏的情况下,它可以超过 8000 万行。

现在,我有 2 张桌子T1T2. 我必须将数据从一个表复制T1到另一个表T2

  • 如果表中T1已经存在表中的一行T2(相同的主键),则将该行的其他列的数据更新T1T2
  • 否则插入新行T2

起初,我使用 while 循环遍历 8000 万行,T1然后更新或插入到T2. 这非常非常非常慢,需要10多个小时才能完成。但是,如果任何行导致错误,我可以忽略它并捕获错误。

之后,我使用如下查询:

update Table2 
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2 
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID

这要快得多,只需大约 1-> 2 小时即可完成。但是,如果任何行有错误,则查询根本无法执行。

所以,我的问题是:

  • 上面的查询有什么办法可以忽略错误行并继续使用有效行执行?

  • 如果我无法做到这一点,我该怎么做才能比第一种方法运行得更快并且还可以捕获错误行?

p/s:我尝试将表拆分为多个小部分,然后同时更新或插入所有小部分,但它并没有更快。

我已经用第二种方法解决了这个问题。我使用 TRY_CAST 来防止插入或更新行时出现异常。任何无效的数据都将为 NULL。完成后,我比较了 2 个表并找到不同的行。这些行是错误行。

4

3 回答 3

0

至于您要求的功能,我建议如下:

MERGE INTO table2 target
USING
(
  SELECT id, column1, column2 FROM table1
) source ([id], [column1], [column2])
ON target.[Id] = source.[Id]
WHEN MATCHED THEN
    UPDATE SET 
        target.Colum1 = source.Column1,
                target.COlumn2 = source.Column2
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN NOT MATCHED BY TARGET THEN
    INSERT ([Id], [Column1], [Column2])
    VALUES([Id], [Column1], [Column2])
;

至于忽略错误 - 我认为这种方式是错误的。在这方面,我会在数据验证方面投入一些精力

于 2013-06-19T10:44:16.423 回答
0

您可以尝试从 T2 中删除现有行,然后从 T1 中批量插入所有行。这取决于现有行的数量,如果它太大,那么这种方法将不起作用。

于 2013-06-19T10:45:03.320 回答
0

我已经用第二种方法解决了这个问题。我使用 TRY_CAST 来防止插入或更新行时出现异常。任何无效的数据都将为 NULL。完成后,我比较了 2 个表并找到不同的行。这些行是错误行。

于 2013-06-20T10:45:20.483 回答