2016-07-29 72 views
0

我有以下查詢:查詢不使用索引的使用使用表功能

select i.pkey as instrument_pkey, 
     p.asof, 
     p.price, 
     p.lastprice as lastprice, 
     p.settlementprice as settlement_price, 
     p.snaptime, 
     p.owner as source_id, 
     i.type as instrument_type 
from quotes_mxsequities p, 
    instruments i, 
    (select instrument, maxbackdays 
     from TABLE(cast (:H_ARRAY as R_TAB))) lbd 
where p.asof between :ASOF - lbd.maxbackdays and :ASOF 
    and p.instrument = lbd.instrument 
    and p.owner = :SOURCE_ID 
    and p.instrument = i.pkey 

既然我已經使用表函數開始,查詢已開始對錶quotes_mxsequities這是大表做全表掃描。

早些時候,當我用IN條款包括表函數索引正在使用。

如何執行索引使用任何建議?

編輯:

我將努力讓解釋計劃,但只是添加,H_ARRAY預計將有10k左右條目。 quotes_mxsequities是一個數百萬行的大表。儀器又是一張大桌子,但行數比quotes_mxsequities少。 全表掃描正在發生的事情爲quotes_mxsequitiesinstruments使用指數

+0

是'HARRAY'去是'quotes_mxsequities'中數據的一小部分 - 表中有多少行,以及您希望匹配多少行?即索引實際上是否合適? –

+0

@Alex:HARRAY可以有大約10k行,而quotes_mxsequities是一個有數百萬行的巨大表。我們希望匹配大約200萬行。 – Lokesh

+0

如果您在數百萬甚至數千萬中匹配200萬行,則無論如何,全表掃描可能會更有效。你剛剛看到一個不同的計劃,或者性能實際上比'IN'差 - 假設數組和匹配數據是相同的? –

回答

1

相當困難,沒有回答解釋計劃和有關表結構,行數等

作爲一般信息,簡化的方法,你可以嘗試強制使用索引INDEX hint

您的問題,甚至可能是由於表處理錯誤的順序;您可以嘗試使Oracle按照正確順序(我首先假設爲LBD)與LEADING hint

還有一點可能是完全訪問,而你可能需要一個嵌套循環;在這種情況下,您可以嘗試USE_NL hint

1

從提供的有限信息中很難確定,但看起來這是優化器無法建立表集合表達式的基數的問題,因爲它的內容在解析時不知道。使用存儲的嵌套表格,統計數據將可用,但這裏沒有可供使用的統計數據。

沒有這些信息的優化器默認爲猜你的表收集將有8K的條目,並使用它作爲基數估計;如果這是quotes_mxsequities中行數的很大一部分,那麼它將決定索引效率不高,並且將使用全表掃描。

可以使用undocumented cardinality hint粗略地告訴優化器實際操作中許多元素期望集合中;你想必不會確切地知道,但你可能知道你通常期望在10左右。所以,你可以添加一個提示:

select /*+ CARDINALITY(lbd, 10) */ i.pkey as instrument_pkey, 

您也可以找到動態採樣提示這裏是有用的,但沒有你的真實數據看在,基數提示適用於基本執行計劃,因此很容易看出其效果。

順便說一句,你不需要對錶表達式子查詢,你可以稍微簡化爲:

from TABLE(cast (:H_ARRAY as R_TAB)) lbd, 
    quotes_mxsequities p, 
    instruments i 

甚至更​​好的利用現代聯接語法:

select /*+ CARDINALITY(lbd, 10) */ i.pkey as instrument_pkey, 
     p.asof, 
     p.price, 
     p.lastprice as lastprice, 
     p.settlementprice as settlement_price, 
     p.snaptime, 
     p.owner as source_id, 
     i.type as instrument_type 
from TABLE(cast (:H_ARRAY as R_TAB)) lbd 
join quotes_mxsequities p 
on p.asof between :ASOF - lbd.maxbackdays and :ASOF 
    and p.instrument = lbd.instrument 
join instruments i 
on i.pkey = p.instrument 
where p.owner = :SOURCE_ID;