【问题标题】:How to get list of values stored in index?如何获取存储在索引中的值列表?
【发布时间】:2014-01-15 11:04:16
【问题描述】:

我在 Oracle 11g R2 中遇到了这个问题。包含使用非唯一索引索引的非空列的表。该索引不包含其他列。

然后我假设如果我从表中查询列的不同值,它将使用索引来获取列的不同值(听起来合乎逻辑)。但是至少解释计划告诉我它正在进行全表扫描。也花了一些时间,所以计划在运行时可能没有改变。优化器索引提示没有帮助。

我试图为此寻找答案,但没有运气。有没有办法获取存储在索引中的值或以某种方式查询表而不“接触”表(就像多列索引连接一样)?

谢谢!

编辑:这是关于 Oracle EBS gl_balances 表和 gl_balances_n2 索引的。我得到了答案,这改变了解释计划:

select /*+ index_ffs(gl gl_balances_n2) */
       distinct gl.period_name
  from gl_balances gl;

【问题讨论】:

  • 一般来说你的假设是正确的。你能发布你的选择声明吗?桌子有多大?
  • 尝试将your_column IS NOT NULL 条件添加到您的查询中,这通常可以解决问题。
  • @YaroslavShabalin 如果列被限制为 NOT NULL,则不应该是必需的,如问题中所述。
  • @DavidAldridge 是的,但在某些情况下它会愚弄 CBO。
  • @YaroslavShabalin 从未见过这种情况。不过,希望看到它的文档示例。

标签: sql database oracle indexing


【解决方案1】:

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

因此,“快速全索引扫描”,也就是您希望得到的计划,可能不如全表扫描快。 (顺便说一下,你会为​​此使用 index_ffs() 提示。)

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

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

【讨论】:

  • 你是对的,谢谢!优化器提示改变了计划,但结果同样慢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多