我在Oracle 11g R2中遇到此问题。包含非空列的表,该列使用非唯一索引编制索引。索引不包含其他列。
然后我假设如果我从表中查询列的不同值,它将使用index来获得列的不同值(对我来说听起来很合理)。但至少解释计划告诉我它正在进行全表扫描。也花了一些时间,所以计划在运行期间没有改变。优化器索引提示没有帮助。
我试图搜索答案,但没有运气。有没有办法获取存储在索引中的值或以某种方式查询表而根本不“触及”表(如多列索引连接可以)?
谢谢!
编辑:这是关于Oracle EBS gl_balances表和gl_balances_n2索引。我得到了答案,这改变了解释计划:
select /*+ index_ffs(gl gl_balances_n2) */
distinct gl.period_name
from gl_balances gl;
答案 0 :(得分:2)
扫描索引可能不比扫描表更有效 - 不要忘记索引段还包含分支节点,并且每个索引条目必须包含大约16字节的ROWID(如果内存服务器) )。
因此,“快速全索引扫描”是您希望获得的计划,可能没有全表扫描那么快。 (顺便说一下,你会使用index_ffs()提示。)
编辑:可以使用更奇特的方法