我有一张表T,有大约500000条记录。该表是一个分层表。 我的目标是根据父子关系的某些条件自行加入同一个表来更新表 更新查询花了很长时间,因为行数非常多。我在列上创建了一个唯一索引,它有助于识别要更新的行(meanign x和Y)。创建索引后,成本已降低,但查询执行速度仍然慢得多。
这是我的查询格式
update T
set a1, b1
= (select T.parent.a1, T.parent.b1
from T T.paremt, T T.child
where T.parent.id = T.child.Parent_id
and T.X = T.child.X
and T.Y = T.child.Y
创建索引后,执行计划显示它正在为CRS.PARENT执行索引扫描,但是对于CRS.CHILD进行全表扫描,并且在更新期间,查询将永远完成。
请提出任何解决此问题的提示或建议
答案 0 :(得分:3)
您正在更新所有500,000行,因此索引是一个坏主意。 500,000个索引查找将花费更长的时间。
使用MERGE
声明可以提供更好的服务。
很难准确地说出你的表结构是什么,但它看起来像这样,假设X和Y是T中的主键列(......可能是错误的):
MERGE INTO T
USING ( SELECT TC.X,
TC.Y,
TP.A1,
TP.A2
FROM T TC
INNER JOIN T TP ON TP.ID = TC.PARENT_ID ) U
ON ( T.X = U.X AND T.Y = U.Y )
WHEN MATCHED THEN UPDATE SET T.A1 = U.A1,
T.A2 = U.A2;