【问题标题】: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。

      【讨论】:

        猜你喜欢
        • 2021-04-01
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 2013-04-08
        • 2017-06-21
        • 2011-10-25
        相关资源
        最近更新 更多