我在理解如何在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;
我得到的是相当于聚集索引,但我不知道它与原始表的关系。我是否必须从原始表插入物联网然后用它代替原始表?
答案 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有用。