我的项目必须处理庞大的数据库。在最坏的情况下,它可以超过 8000 万行。
现在,我有 2 张桌子T1
和T2
. 我必须将数据从一个表复制T1
到另一个表T2
- 如果表中
T1
已经存在表中的一行T2
(相同的主键),则将该行的其他列的数据更新T1
为T2
- 否则插入新行
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 个表并找到不同的行。这些行是错误行。