全,
在下面的场景中,我在Oracle中遇到了一个特殊的问题。
View A - Column 1 - 5
Table B - Column 1, 2, 6-10 (Has millions of Rows)
视图A和表B之间的公共列是列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
虽然我连接的是表上可用的索引,但查询是在表上执行完全扫描,而不是索引扫描。请帮助理解这个问题。
表已分析,没有直方图,还尝试通过在查询中指定索引来进行提示。
发布于 2015-06-02 01:02:38
Oracle是否应该使用索引取决于许多因素。
i)索引旨在提供平均的log(n)
行为。它通过保持索引排序,然后应用binary search
(它实际上使用了一个tree structure
,其中节点包含一些数据子集,但为了便于理解,让我们继续使用它)来实现这一点。所以,从本质上讲,对分搜索是导致log(n)
时间的搜索,但是应该有一些东西可以搜索。在本例中,where子句中没有指定任何内容,那么它应该搜索什么呢?它将不得不读取整个索引,并最终读取整个表。您可以尝试提供hint
,但是它可能会增加查询时间,并且您很容易理解为什么Oracle没有使用您的索引。
ii)数据的Cardinality (Selectivity)
,但我认为这不是问题所在。
https://stackoverflow.com/questions/30577462
复制相似问题