2011-06-09 59 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

索引組織表必須在主鍵上組織。在主鍵是序列生成值的情況下,這通常是無用的或者甚至是相反的(因爲同一塊的同時插入會發生衝突)。

單個表簇可用於在同一個數據庫塊中對具有相同列值的數據進行分組。但他們沒有下令。

相關問題