如何改进更新子查询中引用的 Table 字段
How to Improve Updating a Table's Fields That are Referenced in Subqueries
我有一个 table 是 t运行 的,然后每次由一个进程加载数十万条记录。下一个过程需要通过从各种其他 table 中查找值来为每个记录(没有值)更新几个列,同时利用一些现有的更新 table 自己的列作为引用(在下面的示例中,这可能是 TABLE_A.P1
和 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
当我运行这样的更新时,会话超时。我的问题是,在上述情况下,是否有更好的方法来编写此更新?
您可能会发现单独的更新语句更快:
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;
我有一个 table 是 t运行 的,然后每次由一个进程加载数十万条记录。下一个过程需要通过从各种其他 table 中查找值来为每个记录(没有值)更新几个列,同时利用一些现有的更新 table 自己的列作为引用(在下面的示例中,这可能是 TABLE_A.P1
和 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
当我运行这样的更新时,会话超时。我的问题是,在上述情况下,是否有更好的方法来编写此更新?
您可能会发现单独的更新语句更快:
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;