使用IOT在Oracle中创建聚簇索引?混乱

时间:2018-03-16 23:41:40

标签: oracle indexing

我在理解如何在Oracle中使用IOT作为聚簇索引时遇到一些麻烦。假设我有一个表顺序(order_id,part_id,customer_id,order_date),我想使用IOT创建一个聚集索引。

CREATE TABLE clust_order(
    order_id number,
    part_id number,
    CONSTRAINT part_pk PRIMARY KEY (part_id)
)ORGANIZATION INDEx;

我得到的是相当于聚集索引,但我不知道它与原始表的关系。我是否必须从原始表插入物联网然后用它代替原始表?

1 个答案:

答案 0 :(得分:1)

引用Oracle的Concepts Guide

  

“...在索引组织表中,行存储在定义的索引中   在表的主键上。 B树中的每个索引条目也是   存储非键列值。因此,索引是数据,而且   数据是索引。“

假设我们有一个你问题中描述的ORDER表。

-- create table ORDER_, with test data
-- table name with trailing underscore avoids ORA-00903: invalid table name
create table order_
as
select 
  level * 10000 + trunc( dbms_random.value * 100 ) order_id
, trunc( dbms_random.value * 100000 )              part_id
, dbms_random.string( 'x', 10 )                    customer_id
, trunc( sysdate + level * 10 )                    order_date
from dual connect by level <= 10 ;

测试数据

SQL> select * from order_ ;
ORDER_ID  PART_ID  CUSTOMER_ID  ORDER_DATE  
10069     74711    KBGHAHWTL8   27-MAR-18   
20034     99571    7VUNFJER44   06-APR-18   
30038     64160    ORXP2RRA3K   16-APR-18   
40005     81247    B9N43NSVQ7   26-APR-18   
50019     90889    8H5G12D82E   06-MAY-18   
60017     34107    9O4OSETJ4H   16-MAY-18   
70078     53959    77MUCKJW82   26-MAY-18   
80015     9496     U5J6Z85KXR   05-JUN-18   
90081     88450    2LEUPZGFOS   15-JUN-18   
100031    38487    NX4BHBF3TN   25-JUN-18  

如果您现在只创建一个IOT(索引组织表),它将为空。

-- your original code
CREATE TABLE clust_order(
    order_id number,
    part_id number,
    CONSTRAINT part_pk PRIMARY KEY (part_id)
)ORGANIZATION INDEX;

Table CLUST_ORDER created.

SQL> select * from clust_order ;

no rows selected

您可以做的是:通过从原始表中选择来创建IOT(另请参阅:并行化索引组织表创建here)。

create table clust_order 
( 
  part_id constraint part_pk primary key
, order_id 
) 
organization index
parallel
as
select 
  part_id
, order_id 
from order_;

生成的物联网包含......

SQL> select * from clust_order;
PART_ID  ORDER_ID  
9496     80015     
34107    60017     
38487    100031    
53959    70078     
64160    30038     
74711    10069     
81247    40005     
88450    90081     
90889    50019     
99571    20034 

您可能会发现此discussion有用。