Oracle Sql 调整索引

Oracle Sql tuning with index

我有一个 table T,有大约 500000 条记录。即 table 是分层的 table。 我的目标是根据父子关系的某些条件,通过自我加入相同的 table 来更新 table 更新查询花费的时间非常长,因为行数非常多。我在列上创建了一个唯一索引,它有助于识别要更新的行(意味着 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 进行完整的 table 扫描,并且在更新期间也会作为结果查询将永远完成。

请提出解决此问题的任何提示或建议

您要更新所有 500,000 行,因此索引不是个好主意。 500,000 次索引查找将花费比需要更长的时间。

使用 MERGE 语句会更好。

很难确切地说出你的 table 结构是什么,但它看起来像这样,假设 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;