我的查询如下
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上添加索引会有帮助。因为我在子查询中使用它?
答案 0 :(得分:2)
如果您在(id,amt)
上有一个索引,那么您最大限度地减少/ summation过程中的工作(因为它可以读取索引)。如果两列都可以为空,那么您可能需要添加“where id is null”,因此它将使用索引。 [后者加入id
暗示了这一点,但优化程序可能无法推断。]
下一步是使用物化视图进行求和,也可以使用(amt,id)
上的索引(它可以用来避免排序)。但是,无论是在提交时还是在请求时或按计划的时间间隔刷新。如果您需要在事务中执行此查询,则无效。
索引和物化视图都会为表上的插入/更新/删除添加工作,但会在此查询中保存工作。