SQL Update Query永远运行。需要Oracle性能调优技巧

时间:2014-11-14 12:08:55

标签: sql oracle performance sql-update self-join

我有一张有900万条记录的表格。要求如下: 1.表插入了900万条记录。每个条目都有一个rowid,使用trigger将其插入表中。 2.我们有两列必须在名为First_Insatance和First_Instance_Date的同一个表中单独更新。 3.这些First Instance列应该保存表中存在的重复记录的第一个Rowid编号。

我们使用以下代码进行更新

  UPDATE TABLE_A T4
      SET (T4.ROW_ID_FIRST_INS, T4.ROW_ID_DT_FIRST_INS) =
             (  SELECT MIN (T3.ROW_ID), MIN (T3.UPDATE_DATE)
                  FROM TABLE_A T3
                 WHERE     T3.SOURCE(+) = T4.SOURCE
                       AND    SUBSTR (T3.TABLE_NAME,
                                      1,
                                      REGEXP_INSTR (T3.TABLE_NAME,
                                                    '\_[0-9]{8}T',
                                                    1,
                                                    1,
                                                    0))
                           || SUBSTR (T3.TABLE_NAME,
                                      REGEXP_INSTR (T3.TABLE_NAME,
                                                    '\_[0-9]{8}T',
                                                    1,
                                                    1,
                                                    1),
                                        LENGTH (T3.TABLE_NAME)
                                      - REGEXP_INSTR (T3.TABLE_NAME,
                                                      '\_[0-9]{8}T',
                                                      1,
                                                      1,
                                                      1)) =
                                 SUBSTR (T4.TABLE_NAME,
                                         1,
                                         REGEXP_INSTR (T4.TABLE_NAME,
                                                       '\_[0-9]{8}T',
                                                       1,
                                                       1,
                                                       0))
                              || SUBSTR (T4.TABLE_NAME,
                                         REGEXP_INSTR (T4.TABLE_NAME,
                                                       '\_[0-9]{8}T',
                                                       1,
                                                       1,
                                                       1),
                                           LENGTH (T4.TABLE_NAME)
                                         - REGEXP_INSTR (T4.TABLE_NAME,
                                                        '\_[0-9]{8}T',
                                                         1,
                                                         1,
                                                         1))
                       AND NVL (T4.I_NAM, 'xx') =
                              NVL (T3.I_NAM, 'xx')
                       AND NVL (T4.J_NAM, 'xx') = NVL (T3.J_NAM, 'xx')
                       AND NVL (T4.SYS_NAM, 'xx') =
                              NVL (T3.SYS_NAM, 'xx')
                       AND NVL (T4.TG_TAB_NAM, 'xx') =
                              NVL (T3.TG_TAB_NAM, 'xx')
                       AND NVL (T4.PK, 'xx') = NVL (T3.PK, 'xx')
                       AND NVL (T4.ERR, 'xx') =
                              NVL (T3.ERR, 'xx')
                       AND NVL (T4.VAL, 'xx') =
                              NVL (T3.VAL, 'xx')
                       AND NVL (T4.ID, 'xx') = NVL (T3.ID, 'xx')
              GROUP BY T4.FIELD,
                       T4.ERR,
                       T4.VAL,
                       T4.ID,
                       T4.PK,
                       T4.I_NAM,
                       T4.SYS_NAM,
                       T4.J_NAM)
    WHERE T4.CURRENT_LOAD_ID = some number FROM CURSOR;

对于3050条记​​录,查询需要35秒,但运行4L记录时。它不会在过去的2天内停止运行。

Row_ID是PK并且已经按列创建了NU索引,除了少数大小为4000的列。

感谢。

1 个答案:

答案 0 :(得分:0)

您似乎使用过于复杂的方法来确定使用别名的重复项。 我尝试按照这些方式整合更简单的东西。 选择ID 从 表格1 通过...分组 id有计数(id)> 1

如果没有您的表格结构,一些示例数据以及问题的完整解释,则很难做得更多。