我的项目必须处理庞大的数据库。在最糟糕的情况下,它可能超过8千万行。
现在,我有2个表T1
和T2
。我必须将表格T1
中的数据复制到表格T2
T1
中已存在表T2
中的某一行(相同的主键),则将T1
中该行的其他列的数据更新为T2
< / LI>
T2
首先,我使用while循环遍历T1
中的8千万行,然后更新或插入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表并找到不同的行。这些行是错误行。
答案 0 :(得分: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])
;
至于忽略错误 - 我认为这是错误的。在这方面,我会投入一些精力进行数据验证
答案 1 :(得分:0)
您可以尝试从T2删除现有行,然后批量插入T1中的所有行。它取决于现有行的数量,如果它太大,那么这种方法将无效。
答案 2 :(得分:0)
我用第二种方法解决了这个问题。我在插入或更新行时使用TRY_CAST来防止异常。任何无效的数据都将为NULL。完成后,我比较2表并找到不同的行。这些行是错误行。