甲骨文指数回升

时间:2015-06-01 15:32:17

标签: oracle oracle11g query-performance sql-execution-plan

全部,

我在Oracle中面临一个特殊问题,即后续方案。

View A - Column 1 - 5
Table B - Column 1, 2, 6-10 (Has millions of Rows)

视图A和表B之间的公共列是第1列和第1列。 2.

表B在第1,2列上有索引。

查询就像这样

SELECT vw.column3, vw.column4, vw.column5, tbl.column2, tbl.column6... tbl.column10
  from viewA vw
  join tableB tbl
    on tbl.column1 = vw.column1
       and tbl.column2 = vw.column2

虽然我正在加入表中可用的索引,但查询正在对表进行全扫描而不是索引扫描。请帮助理解这个问题。

TABLE ANALYZED,NO HISTOGRAM,TRIED HINTING也通过在查询中指定索引。

1 个答案:

答案 0 :(得分:0)

Oracle是否应该使用索引或不依赖于许多因素。

i)索引旨在平均提供log(n)行为。它通过保持索引排序然后应用binary search来实现这一点(它实际上使用tree structure,其中节点包含一些数据子集,但为了理解让我们坚持下去)。 所以,基本上二元搜索是导致log(n)时间的搜索,但应该有搜索的东西。在你的情况下,where子句中没有指定任何内容,那么它应该搜索什么?它必须读取整个索引并最终读取整个表。 您可以尝试提供hint,但这可能会增加查询时间,您可以轻松了解Oracle未使用索引的原因。

ii)Cardinality (Selectivity)数据,但我认为这不是问题。