【问题标题】:How can I see the contents of an Oracle index?如何查看 Oracle 索引的内容?
【发布时间】:2011-03-28 11:00:56
【问题描述】:
是否可以使用 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 查询可以让我实际看到索引的内容?
【问题讨论】:
标签:
sql
database
oracle
indexing
sqlplus
【解决方案1】:
这不是一个简单的查询 - 您可以转储表或索引块以跟踪文件,但您必须确定您感兴趣的块。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 不会在所有被索引的值都为空的情况下编写索引条目,因此如果 id 可以为空,我们需要将它们过滤掉。 index_ffs 提示强制 Oracle 满足读取索引块而不是数据块的查询。这个“解决方案”不显示根块或分支块中的数据,而块转储可以。
【解决方案2】:
如果您正在索引 EMP_ID - 那么该特定列中的所有值都会被索引
作为叶子 - 例如B-Tree 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 - 在 min 和 max 之间,仅放置 40 个不同的索引值 - 列 emp_id 中的所有值。
不要忘记,即使是 PK,您仍然可以使用 B-TREE/BITMAP INDEX UNIQUE 或 NON-UNIQUE。