提示oracle在子查询上使用索引 - Oracle SQl

时间:2011-08-17 19:41:20

标签: oracle query-optimization oracle11gr2

我的查询如下

select *
from
( select id,sum(amt) amt from table_t group by id
) t inner join table_v v on (v.id = t.id)
order by t.amt desc;

table_t没有索引,有738,000行,table_v有一个id的索引,有158,000行。

查询当前在10秒内获取结果。

解释查询计划显示全表扫描..如何在此处提高性能?

如果我在table_t的id上添加索引会有帮助。因为我在子查询中使用它?

1 个答案:

答案 0 :(得分:2)

如果您在(id,amt)上有一个索引,那么您最大限度地减少/ summation过程中的工作(因为它可以读取索引)。如果两列都可以为空,那么您可能需要添加“where id is null”,因此它将使用索引。 [后者加入id暗示了这一点,但优化程序可能无法推断。]

下一步是使用物化视图进行求和,也可以使用(amt,id)上的索引(它可以用来避免排序)。但是,无论是在提交时还是在请求时或按计划的时间间隔刷新。如果您需要在事务中执行此查询,则无效。

索引和物化视图都会为表上的插入/更新/删除添加工作,但会在此查询中保存工作。