使用索引进行Oracle Sql调优

时间:2017-02-10 17:39:37

标签: sql oracle performance query-performance

我有一张表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进行全表扫描,并且在更新期间,查询将永远完成。

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

1 个答案:

答案 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;