代码之家  ›  专栏  ›  技术社区  ›  Ronaldo Lanhellas

使用WHERE和PK用Foreach更新百万行

  •  0
  • Ronaldo Lanhellas  · 技术社区  · 5 年前

    我有以下用例:

    我有一个大约有1000万行的批处理文件。每一行代表我的目标数据库表中的一行,但如果要更新或插入这一行,我不会这样做,所以我有以下逻辑:

    1. 取一行并尝试进行UPDATE(始终使用PK),如果结果为0(不影响行),则转到步骤2。
    2. 取与步骤1相同的行,并执行INSERT。

    关于这一逻辑的一些考虑:

    1. 我正在使用SQL Server
    2. 我分块执行步骤1和2,每1000行一次。因此,我得到了1000行来执行步骤1,通过这个返回,我执行了步骤2。
    3. 我的表只有PK中的索引,UPDATE只使用PK中的WHERE执行。
    4. UPDATE比INSERT慢100倍。UPDATE在1小时内执行,INSERT在1分钟内执行。
    5. INSERT在事务内部执行,使用批插入。
    6. UPDATE不是在事务中执行的,我试图在事务中使用1000个UPDATEs,但我遇到了死锁,因为我的应用程序是多线程的,需要并行执行步骤1和2。

    我认为可以解决这个问题的一些事情:

    1. 试着理解为什么UPDATE如此缓慢。但实际上,在这种情况下,我不知道从哪里开始,我的更新似乎是正确的。这是一个例子:
        UPDATE TABLEA SET ATTR1 = LINE1_ATTR1, ATTR2 = LINE2_ATTR2
        WHERE ATTR_PK1 = LINE1_ATTR_PK1 AND ATTR_PK2 = LINE1_ATTR_PK2;
    
    1. 更改逻辑:在用ORIGINAL表和TEMP表执行UPDATE FROM后,将所有1000万行插入TEMP表中(因为Insert更快)。
    0 回复  |  直到 5 年前