主鍵local索引、unique local索引、分割槽索引順序的理解

lusklusklusk發表於2017-09-12
CREATE TABLE TEST1 (hid number,hid2 number,hchar1 char(50)) 
PARTITION BY RANGE(hid) INTERVAL (10)
( PARTITION p01 VALUES LESS THAN (5));

主鍵不加USING INDEX LOCAL預設是全域性索引
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid)  --全域性索引;
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid) USING INDEX LOCAL;

主鍵是非分割槽欄位
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2)  --正常執行;
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2) USING INDEX LOCAL --報錯ORA-14039: 分割槽列必須構成 UNIQUE 索引的關鍵字列子集;
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2,hid) USING INDEX LOCAL  --正常執行;

unique索引是非分割槽欄位
create unique index pk_ID on TEST1(HID2) local--報錯ORA-14039: 分割槽列必須構成 UNIQUE 索引的關鍵字列子集;
create unique index pk_ID on TEST1(HID2,HID) local --正常執行;

create unique index pk_ID on TEST1(HID2) --正常執行;
alter table TEST1 add constraint pk_ID2 primary key(HID2) using index pk_ID --正常執行;

create index pk_ID99 on TEST1(HID2) local --正常執行;
alter table TEST1 add constraint pk_ID99_2 primary key(HID2) using index pk_ID99  --報錯ORA-14196: 指定的索引不能用於強制約束條件;

非分割槽欄位建立主鍵,則建立主鍵local索引時必須加上分割槽欄位
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主鍵欄位,分割槽欄位) USING INDEX LOCAL;

主鍵做local索引必須包含分割槽鍵的欄位。這和oracle 如何保證紀錄唯一有關,如果unique index key沒有partition_key,那麼每插入一行的紀錄,只保證它所進入的分割槽中是唯一的,不保證在整個表上這個記錄是否唯一,這就違背了主鍵的意義。(如果和分割槽欄位一起繫結,則不需要掃描所有的索引分割槽就能驗證整個表上這個記錄是否唯一)。


range分割槽,單個分割槽內非分割槽欄位的值不是順序的,分割槽欄位值也不是順序的(如按100值分割槽,第一個分割槽是1-100,順序可能是7,1,3,67,9這樣的,第二分割槽101-200,順序可能是199,136,103,178這樣的,但是相對兩個分割槽而言,第二個分割槽和第一個分割槽值的範圍是順序的)
分割槽欄位的分割槽索引是順序的,因為第一個資料分割槽開始到後面的資料分割槽是range順序的,雖然單獨的資料分割槽內資料不是順序的
非分割槽欄位只是某一分割槽索引內的索引是順序的,不代表分割槽索引是順序的

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2144878/,如需轉載,請註明出處,否則將追究法律責任。

相關文章