1

我有一个查询如下

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 上添加索引会有所帮助。因为我在子查询中使用它?

4

1 回答 1

2

如果您有索引,(id,amt)您将最小化分组/求和过程中的工作(因为它可以读取索引)。如果两列都可以为空,那么您可能需要添加“其中 id 不为空”,以便它使用索引。[后面的 join on 暗示了这一点id,但优化器可能无法推断出来。]

下一步是使用物化视图进行求和,可能带有索引(amt,id)(它可以用来避免排序)。但这会在提交或请求时或按计划的时间间隔刷新。如果您需要将此查询作为事务的一部分进行,则无济于事。

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

于 2011-08-17T23:44:45.020 回答