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

gin*_*ino 10 oracle indexing

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

我弄完了

select FIELD from TABLE where rownum <100
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*rat 10

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

您可以通过查看视图中的IOT_TYPE列来确定表是否是IOT ALL_TABLES(可以通过查询ALL_CONSTRAINTSALL_CONS_COLUMNS视图来确定其主键).

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

  1. 您的表是索引组织的,并且FIELD是其主键的主要部分.
  2. 您的表是堆组织的,但行是按顺序排序的FIELD,有时会在递增的标识列上发生.

案例2只会偶然返回已排序的行.无法保证插入的顺序,而且如果某些事件在将来碰巧有可用空间,Oracle可以自由地重用旧块,从而破坏脆弱的排序.

大多数情况下,情况1将返回有序行,但是您不应该依赖它,因为返回的行的顺序取决于访问路径的算法,该算法将来可能会更改(或者如果您更改数据库参数,尤其是并行性).

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

SELECT field 
  FROM (SELECT field 
          FROM TABLE 
         ORDER BY field) 
 WHERE rownum <= 100;
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 7

Oracle中没有"聚集索引"的概念,如SQL Server和Sybase.有一个索引组织表,类似但不一样.


Mik*_*use 5

在Sybase,MS SQL Server和其他可能的情况下实现的"群集"索引(其中行按索引列的顺序物理存储)在Oracle中不存在."集群" 在Oracle中具有不同的含义,我相信,它与块和表的组织方式有关.

Oracle 确实有"索引组织表",它们在物理上是等价的,但它们的使用频率要低得多,因为查询优化器的工作方式不同.

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

SELECT IOT_TYPE FROM user_tables
WHERE table_name = '<your table name>'
Run Code Online (Sandbox Code Playgroud)

我的10g实例报告IOTnull相应的.