如何查看Oracle索引的内容?

时间:2010-08-11 15:18:30

标签: sql database oracle indexing sqlplus

是否可以使用SQL * Plus查看索引内部的内容?

如果我有这样的表:

Table A
------------------------
rowid  |  id   name
123    |  1    A
124    |  4    G
125    |  2    R
126    |  3    P

其中id是主键,我希望索引是这样的

index on A.id
-------------
id  rowid
1   123
2   125
3   126
4   124

是否有一些SQL查询用于实际查看索引的内容?

2 个答案:

答案 0 :(得分:4)

没有简单的查询 - 您可以将表或索引块转储到跟踪文件,但是您必须识别您感兴趣的块.Dion Cho有example如何处理此块转储使用SQL,但它不适合胆小的人。

但是,你可以这样做:

select /* index_ffs (a [name of index]) */
       id, rowid 
  from a
 where id is not null
 order by id, rowid;

Oracle不会编写索引条目,其中所有被索引的值都为null,因此如果id可以为空,我们需要将其过滤掉。 index_ffs提示强制Oracle满足读取索引块的查询,而不是数据块。此“解决方案”不显示将在根块或分支块中的数据,而块转储可以。

答案 1 :(得分:0)

如果您正在索引EMP_ID-则该特定列中的所有值都将被索引 作为叶子-例如B树ASC索引-在叶子部分的左侧,您应该看到MIN(indexed_value)或在右侧站点,您应该看到MAX(indexed_value)-DESC相反。 但是,如果您要查询BRANCHES / ROOT值,我无济于事-但总的来说,它并不那么重要。 解释计划:

select **min**(emp_id) 
from emp
where emp_id < 100;

select **max**(emp_id) 
from emp
where emp_id < 100;

并将其相互比较( CARDINALITY 1 )-它仅读取一行 来自对象IND_EMP_ID

and then explain plan for:
select **min**(employee_id), **max**(employee_id) 
from employees 
where employee_id < 100;

- CARDINALITY 40 -在最小值和最大值之间,仅放置了索引中的40个不同值-emp_id列中的所有值。

不要忘记,即使对于PK,您仍然可以使用B-TREE / BITMAP INDEX UNIQUE或NON-UNIQUE。

相关问题