2011-06-09 139 views
10

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

我做

select FIELD from TABLE where rownum <100 

其中FIELD是在其上建立索引的字段。我订购了元组,但结果是错误的,因为索引是非集群的。

+3

没有ORDER BY没有订单。你需要SELECT * FROM(select * from table order by col_a),其中rownum <100 – 2011-06-09 09:38:06

回答

7

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

10

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

可以确定如果一个表是IOT通过查看在ALL_TABLES视图IOT_TYPE柱(其主键可以通过查询ALL_CONSTRAINTSALL_CONS_COLUMNS视图所确定的)。

这里有一些原因,您的查询可能返回命令行:

  1. 你的表是索引组织和FIELD是其主键的主导作用。
  2. 您的表是堆组织的,但行偶有机会按FIELD排序,这种情况有时会在增量标识列上发生。

第2种情况只会偶然返回排序行。不能保证插入的顺序,而且如果将来有一些碰巧有可用空间的话,Oracle可以自由复用旧块,从而破坏脆弱的排序。

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

如果您想订购行,你应该提供一个ORDER BY子句两个案例:

SELECT field 
    FROM (SELECT field 
      FROM TABLE 
     ORDER BY field) 
WHERE rownum <= 100; 
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相应。

2

索引组织表必须在主键上组织。在主键是序列生成值的情况下,这通常是无用的或者甚至是相反的(因为同一块的同时插入会发生冲突)。

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