如何改进更新子查询中引用的 Table 字段

How to Improve Updating a Table's Fields That are Referenced in Subqueries

我有一个 table 是 t运行 的,然后每次由一个进程加载数十万条记录。下一个过程需要通过从各种其他 table 中查找值来为每个记录(没有值)更新几个列,同时利用一些现有的更新 table 自己的列作为引用(在下面的示例中,这可能是 TABLE_A.P1TABLE_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

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

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

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);

祝你好运。

您可以尝试以下方法:

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;

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

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;