【问题标题】:How to Improve Updating a Table's Fields That are Referenced in Subqueries如何改进更新子查询中引用的表字段
【发布时间】:2018-12-18 23:45:05
【问题描述】:

我有一个被截断的表,然后每次由一个进程加载数十万条记录。下一个过程需要通过基本上从各种其他表中查找值同时利用一些现有的更新表自己的列作为参考来更新每条记录(没有值)的几个列(在下面的示例中,这可能是 @ 987654321@和TABLE_A.P2),例如:

UPDATE TABLE_A A SET
  A.COL1 = (
    SELECT B.COL_BX
    FROM TABLE_B B
    WHERE B.P1 = A.P1 -- Reference back to the updating table's column
  ),
  A.COL2 = (
    SELECT D.COL_DY
    FROM TABLE_C C INNER JOIN TABLE_D D
      ON C.H1 = D.H1
    WHERE C.P1 = A.P1 -- Reference back to the updating table's column
                      -- Would this act as a join between A and C (not implementation-wise but rather functionality)? 
  ),
  A.COL3 = (
    SELECT G.COL_GZ
    FROM TABLE_E E INNER JOIN TABLE_F F
        ON E.N1 = F.N1
      OUTER JOIN TABLE_G G
        ON G.M1 = F.M1
    WHERE E.P1 = A.P1
      AND E.P2 = A.P2
      -- AND (bunch of other predicate for G columns)
  ); -- There are more columns to be updated but omitted for brevity

当我运行此类更新时,会话超时。我的问题是,鉴于上述情况,是否有更好的方法来编写此更新?

【问题讨论】:

    标签: sql oracle oracle11g sql-update query-performance


    【解决方案1】:

    您可能会发现单独的更新语句更快:

    UPDATE TABLE_A A
      SET A.COL1 = (SELECT B.COL_BX
                      FROM TABLE_B B
                      WHERE B.P1 = A.P1);
    
    UPDATE TABLE_A A
      SET A.COL2 = (SELECT D.COL_DY
                      FROM TABLE_C C
                      INNER JOIN TABLE_D D
                        ON C.H1 = D.H1
                      WHERE C.P1 = A.P1);
    
    UPDATE TABLE_A A
      SET A.COL3 = (SELECT G.COL_GZ
                      FROM TABLE_E E
                      INNER JOIN TABLE_F F
                        ON E.N1 = F.N1
                      LEFT OUTER JOIN TABLE_G G
                        ON G.M1 = F.M1
                      WHERE E.P1 = A.P1 AND
                            E.P2 = A.P2);
    

    祝你好运。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      UPDATE TABLE_A 
        SET TABLE_A.COL1 = B.COL_BX
      From 
        TABLE_A A
      INNER JOIN 
        TABLE_B B
        ON B.P1 = A.P1;
      
      UPDATE TABLE_A 
        SET TABLE_A.COL2 = D.COL_DY
      From 
        TABLE_A A
      INNER JOIN 
        TABLE_C C
        ON C.P1 = A.P1
      INNER JOIN 
        TABLE_D D
        ON C.H1 = D.H1;
      
      UPDATE TABLE_A 
        SET TABLE_A.COL3 = G.COL_GZ
      From 
        TABLE_A A
      INNER JOIN 
        TABLE_E E
        ON E.P1 = A.P1
        AND E.P2 = A.P2
      INNER JOIN 
        TABLE_F F
        ON E.N1 = F.N1
      LEFT OUTER JOIN 
        TABLE_G G
        ON G.M1 = F.M1;
      

      我不知道有关您的表结构的详细信息,但您可以将这 3 个更新合并为一个,如下所示,但这完全取决于您的表结构。

      UPDATE TABLE_A 
        SET 
        TABLE_A.COL1 = B.COL_BX,
        TABLE_A.COL2 = D.COL_DY,
        TABLE_A.COL3 = G.COL_GZ
      From 
        TABLE_A A
      LEFT OUTER JOIN 
        TABLE_B B
        ON B.P1 = A.P1
      LEFT OUTER JOIN 
        TABLE_C C
        ON C.P1 = A.P1
      LEFT OUTER JOIN 
        TABLE_D D
        ON C.H1 = D.H1
      LEFT OUTER JOIN
        TABLE_E E
        ON E.P1 = A.P1
        AND E.P2 = A.P2
      LEFT OUTER JOIN 
        TABLE_F F
        ON E.N1 = F.N1
      LEFT OUTER JOIN 
        TABLE_G G
        ON G.M1 = F.M1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2015-09-27
        相关资源
        最近更新 更多