代码之家  ›  专栏  ›  技术社区  ›  cblanto7

如何加快此更新和设置?

  •  2
  • cblanto7  · 技术社区  · 8 年前

    我有两张桌子,x和y

    我创建了一个查询,用y.col\u p列的总和更新x.col\u p,其中它们都匹配特定的日期和ID。

    UPDATE x 
    SET col_p = (
        SELECT sum(col_p) 
        FROM y 
        WHERE concat(x.mmonth, x.dday, x.yyear) = (concat(y.mmonth, y.dday, y.yyear))
            AND x.ID = y.ID
        )
    

    2 回复  |  直到 8 年前
        1
  •  3
  •   Gordon Linoff    8 年前

    我建议将问题写为:

    UPDATE x 
        SET col_p = (SELECT sum(col_p) 
                     FROM y 
                     WHERE x.yyear = y.yyear AND x.mmonth = y.mmonth AND
                           x.dday = y.dday AND x.ID = y.ID
                    );
    

    然后确保你有一个索引 y(ID, yyear, mmonth, dday, col_p) .

        2
  •  1
  •   Mehmet Kaplan    8 年前

    你可以做的事情是:

    1. y 由主键(其中列)访问 y.id 是第一列)。
    2. 如果没有任何空列,则似乎不需要 concat . 这就是为什么,而不是 concat(x.mmonth, x.dday, x.yyear) = (concat(y.mmonth, y.dday, y.yyear)) (x.mmonth, x.dday, x.yyear) = (y.mmonth, y.dday, y.yyear) .
    3. 在你确定之后, y update 通过向 x update /*+ PARALLEL(x 4) */ x ... 为此步骤,请小心正确使用系统资源。

    总而言之,我的建议是:;

    • 通过主键
    • 到达您进行完全扫描的表格,即表格 x