Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中的索引是聚集的还是未聚集的?_Oracle_Indexing - Fatal编程技术网

Oracle中的索引是聚集的还是未聚集的?

Oracle中的索引是聚集的还是未聚集的?,oracle,indexing,Oracle,Indexing,如何确定Oracle索引是群集索引还是非群集索引 我做完了 select FIELD from TABLE where rownum <100 其中FIELD是构建索引的字段。我对元组进行了排序,但结果是错误的,因为索引未进行聚类。Oracle中没有SQL Server和Sybase中的聚类索引概念。有一个类似但不相同的索引。默认情况下,Oracle中的所有索引都是未聚集的。Oracle中唯一的聚集索引是索引组织的表IOT主键索引 您可以通过查看ALL_TABLES视图中的IOT_TYP

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

我做完了

select FIELD from TABLE where rownum <100

其中FIELD是构建索引的字段。我对元组进行了排序,但结果是错误的,因为索引未进行聚类。

Oracle中没有SQL Server和Sybase中的聚类索引概念。有一个类似但不相同的索引。

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

您可以通过查看ALL_TABLES视图中的IOT_TYPE列来确定表是否为IOT,其主键可以通过查询ALL_约束和ALL_CONS_列视图来确定

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

您的表是索引组织的,字段是其主键的前导部分。 您的表是堆组织的,但行是按字段顺序排列的,这种情况有时发生在递增的标识列上。 案例2只会偶然返回已排序的行。插入的顺序没有保证,而且,如果某些块将来碰巧有可用空间,Oracle可以自由地重用旧块,从而破坏脆弱的顺序

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

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

SELECT field 
  FROM (SELECT field 
          FROM TABLE 
         ORDER BY field) 
 WHERE rownum <= 100;

在Sybase、MS SQL Server和其他可能的系统中实现的聚集索引(行按索引列的顺序进行物理存储)在Oracle中并不存在。我相信,集群与块和表的组织方式有关

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

我能找到的最接近身份识别问题的答案是尝试以下方法:

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

我的10g实例相应地报告IOT或null。

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


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

没有订单就没有订单。您需要按列a从SELECT*表格顺序中选择,其中rownum<100