2016-07-29 77 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;