2011-08-17 88 views
1

我有一個查詢如下提示甲骨文的子查詢使用索引 - 的Oracle SQL

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沒有索引,有738000行,table_v對ID的指標,有158000行。

該查詢當前在10秒內獲取結果。

解釋查詢計劃顯示全表掃描..我該如何提高性能?

如果我在table_t的id上添加一個索引,它會有幫助。因爲我在一個子查詢中使用它?

回答

2

如果您對(id,amt)你會最小化/累加處理組在工作(因爲它可以讀取索引)的索引。如果兩列都可以爲空,那麼您可能需要添加「where id is not null」,以便使用索引。 [這暗示後面加入id,但可能不會被優化器推斷。]

下一步是使用物化視圖進行求和,也許使用(amt,id)(它可以用來避免那種)。但是,這可以通過提交或按要求或按計劃的時間間隔進行刷新。如果您需要將此查詢作爲事務的一部分,則不起作用。

兩個索引和物化視圖會增加工作刀片放在桌上/更新/刪除,但保存工作在此查詢。