【发布时间】:2013-06-15 20:07:24
【问题描述】:
我的项目必须处理庞大的数据库。在最坏的情况下,它可能超过 8000 万行。
现在,我有 2 张桌子 T1 和 T2。我必须将数据从表T1 复制到表T2
- 如果表
T1中的一行已经存在于表T2中(相同的主键),则将T1中该行的其他列的数据更新为T2 - 否则将新行插入
T2
首先,我使用 while 循环遍历 T1 中的 8000 万行,然后更新或插入到 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 个表并找到不同的行。这些行是错误行。
【问题讨论】:
标签: c# sql-server stored-procedures large-data