如何获取存储在索引中的值列表?

时间:2014-01-15 11:04:17

标签: sql database oracle indexing

我在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;

1 个答案:

答案 0 :(得分:2)

扫描索引可能不比扫描表更有效 - 不要忘记索引段还包含分支节点,并且每个索引条目必须包含大约16字节的ROWID(如果内存服务器) )。

因此,“快速全索引扫描”是您希望获得的计划,可能没有全表扫描那么快。 (顺便说一下,你会使用index_ffs()提示。)

编辑:可以使用更奇特的方法

  • 通过使用DBMS_Scheduler定期查询表来维护您自己的列表。
  • 物化视图。按需完成刷新可能就足够了,但不仅仅是定期查询数据和维护自己的唯一列表。
  • 使索引压缩,但这对于长条索引键只有价值。
  • 位图索引 - 不适用于同时修改的表。