SQL更新查询永远运行。需要Oracle性能调整提示
我有一张有900万条记录的桌子。要求如下: 1.表中插入了900万条记录。每个条目都有一个rowid,该rowid使用触发器插入到表中。 2.我们在同一个表中有两列需要分别更新,分别称为First_InStatance和First_Instance_Date。 3.这些第一个实例列应该包含表中存在的重复记录的第一个Rowid编号 我们正在使用下面的代码进行更新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
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和日期。这是我需要为大量数据实现的目标。