SQL更新查询永远运行。需要Oracle性能调整提示

SQL更新查询永远运行。需要Oracle性能调整提示,sql,oracle,performance,sql-update,self-join,Sql,Oracle,Performance,Sql Update,Self Join,我有一张有900万条记录的桌子。要求如下: 1.表中插入了900万条记录。每个条目都有一个rowid,该rowid使用触发器插入到表中。 2.我们在同一个表中有两列需要分别更新,分别称为First_InStatance和First_Instance_Date。 3.这些第一个实例列应该包含表中存在的重复记录的第一个Rowid编号 我们正在使用下面的代码进行更新 UPDATE TABLE_A T4 SET (T4.ROW_ID_FIRST_INS, T4.ROW_ID_DT_FIR

我有一张有900万条记录的桌子。要求如下: 1.表中插入了900万条记录。每个条目都有一个rowid,该rowid使用触发器插入到表中。 2.我们在同一个表中有两列需要分别更新,分别称为First_InStatance和First_Instance_Date。 3.这些第一个实例列应该包含表中存在的重复记录的第一个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条记录需要35秒。从过去两天开始,它不会停止运行

Row_ID是PK,并且在所有group by列上创建了NU索引,只有少数列的大小为4000


谢谢。

您似乎使用了一种过于复杂的方法来使用别名确定重复项。 我会尝试按照这些思路整合一些更简单的东西。 选择id 从…起 表1 分组 具有计数(id)>1的id


如果没有表结构、一些示例数据和对问题的完整解释,就很难做更多的工作

你检查过桌子上的其他锁了吗?是的。没有锁。我为此生成了解释计划,但成本非常高。它超过了一百万。如果我是你,我会跟踪会话,看看会发生什么。顺便说一句,如果建议只使用ROWID作为主键,因为在执行此类语句时ROWID可能会改变:alter table t shorn space compact,alter table t move,闪回表t to…实际上它不是ROWID,而是由触发器插入的序列。看起来很像罗维德。我们必须对记录进行分组,并更新每组记录的第一个值。不过,我们有一个DBA团队来监控这项工作。感谢您的回复。我可以为您提供一个示例数据:感谢您的回复。我可以为您提供一个示例数据:行id col1 col2 col3 date first_ins first_ins_ins dt 1 a B C sysdate 1 sysdate 2 E F G sysdate 2 sysdate 3 a B C sysdate+1 sysdate 4 a B C sysdate+2 1 sysdate 5 H I J sysdate+2 5 sysdate+2在上述数据中可以看到first instance和first instance列在重复数据的任何地方都有第一个rowid和日期。这是我需要为大量数据实现的目标。