Oracle中的索引是聚簇还是非聚簇?

时间:2011-06-09 09:04:43

标签: oracle indexing

如何确定Oracle索引是群集还是非群集?

我已经完成了

select FIELD from TABLE where rownum <100

其中FIELD是构建索引的字段。我已经订购了元组,但结果是错误的,因为索引是非聚集的。

4 个答案:

答案 0 :(得分:10)

默认情况下,Oracle中的所有索引都是非聚集的。 Oracle中唯一的聚簇索引是索引组织表(IOT)主键索引。

您可以通过查看IOT_TYPE视图中的ALL_TABLES列来确定某个表是否是IOT(可以通过查询ALL_CONSTRAINTS和{{1}来确定其主键观点)。

以下是您的查询可能返回有序行的一些原因:

  1. 您的表格是由索引组织的,ALL_CONS_COLUMNS是其主键的主要部分。
  2. 您的表是堆组织的,但行是按FIELD顺序排序的,有时会在递增的标识列上发生。
  3. 案例2只会偶然返回已排序的行。无法保证插入的顺序,而且如果某些事件在将来碰巧有可用空间,Oracle可以自由地重用旧块,从而破坏脆弱的排序。

    案例1大部分时间都会返回有序行,但是您不应该依赖它,因为返回的行的顺序取决于访问路径的算法,该算法将来可能会更改(或者如果您更改数据库参数,尤其是并行性。)

    在这两种情况下,如果你想要有序的行,你应该提供一个ORDER BY子句:

    FIELD

答案 1 :(得分:7)

Oracle中没有“聚集索引”的概念,就像在SQL Server和Sybase中一样。有Index-Organized Table,类似但不一样。

答案 2 :(得分:5)

“集群”索引(在Sybase,MS SQL Server和其他可能的其他实现中实现,其中行按索引列的顺序物理存储)在Oracle中不存在。 “群集”有a different meaning in Oracle,我相信,它与块和表的组织方式有关。

Oracle 具有“索引组织表”,它们在物理上是等价的,但由于查询优化器的工作方式不同,所以它们的使用频率要低得多。

我最接近识别问题的答案是尝试这样的事情:

SELECT IOT_TYPE FROM user_tables
WHERE table_name = '<your table name>'

我的10g实例会相应地报告IOTnull

答案 3 :(得分:2)

必须在主键上组织索引组织表。如果主键是序列生成的值,这通常是无用的,甚至是适得其反的(因为同时插入会对同一个块产生冲突)。

单个表簇可用于在同一个数据库块中对具有相同列值的数据进行分组。但他们没有订购。