【发布时间】:2016-12-03 20:14:04
【问题描述】:
我有以下查询:
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 是一个数百万行的大表。 Instruments 又是一个大表,但行数少于quotes_mxsequities。
quotes_mxsequities 正在进行全表扫描,而 instruments 正在使用索引
【问题讨论】:
-
HARRAY是quotes_mxsequities中数据的一小部分吗?表中有多少行,您希望匹配多少行?即索引实际上是否合适? -
@Alex:HARRAY 可以有大约 10k 行,而 quotes_mxsequities 是一个包含数百万行的巨大表。我们期望匹配大约 200 万行。
-
如果您要匹配数百万甚至数千万行中的 200 万行,那么全表扫描可能会更有效。您只是看到了不同的计划,还是性能实际上比
IN更差 - 假设数组和匹配数据相同? -
@Alex:因此,如果它使用索引并在 2-3 分钟内完成,则它的性能非常好,而使用全表扫描则需要数小时。使用 in 子句大约需要 4 分钟。
-
好的,基数提示有帮助吗?我不确定它是否会与那么大但值得尝试的阵列一起使用。或者动态采样提示,也许?
标签: sql oracle performance oracle12c