我有以下用例:
我有一个大约有1000万行的批处理文件。每一行代表我的目标数据库表中的一行,但如果要更新或插入这一行,我不会这样做,所以我有以下逻辑:
-
取一行并尝试进行UPDATE(始终使用PK),如果结果为0(不影响行),则转到步骤2。
-
取与步骤1相同的行,并执行INSERT。
关于这一逻辑的一些考虑:
-
我正在使用SQL Server
-
我分块执行步骤1和2,每1000行一次。因此,我得到了1000行来执行步骤1,通过这个返回,我执行了步骤2。
-
我的表只有PK中的索引,UPDATE只使用PK中的WHERE执行。
-
UPDATE比INSERT慢100倍。UPDATE在1小时内执行,INSERT在1分钟内执行。
-
INSERT在事务内部执行,使用批插入。
-
UPDATE不是在事务中执行的,我试图在事务中使用1000个UPDATEs,但我遇到了死锁,因为我的应用程序是多线程的,需要并行执行步骤1和2。
我认为可以解决这个问题的一些事情:
-
试着理解为什么UPDATE如此缓慢。但实际上,在这种情况下,我不知道从哪里开始,我的更新似乎是正确的。这是一个例子:
UPDATE TABLEA SET ATTR1 = LINE1_ATTR1, ATTR2 = LINE2_ATTR2
WHERE ATTR_PK1 = LINE1_ATTR_PK1 AND ATTR_PK2 = LINE1_ATTR_PK2;
-
更改逻辑:在用ORIGINAL表和TEMP表执行UPDATE FROM后,将所有1000万行插入TEMP表中(因为Insert更快)。