作者fantasyj (如夢似幻)
看板Database
標題Re: [系統] Oracle的 index
時間Sat Jul 9 22:26:02 2011
※ 引述《bohei (run and fall)》之銘言:
: Oracle 的index一直擾著我 ...
: goolge很久都找不到我想到的資訊
Oracle的資料非常好找,請上Oracle官網下載相關版本的User Guide
: 我想請問的是
: index是將設為index的欄位與rowid另外建立一個table嗎
Index不是Table
: 然後依照選擇的欄位排序
: 利用排序後的搜尋速度加快的原理 再去對應的rowid拿取資料
: 這樣的想法對嗎?
這是對的,但是額外一提Oracle跟其他DB不同,Index並不是Create之後,
就一定會使用,這個部份就自己去看User Guide有關RBO與CBO的差別
: 然後第二個問題是unique index
: unique index跟index的差別是否只在限制值是唯一
: 其索引原理也是跟普通index相同嗎?
在一般正統的DB上,會有PK與FK的部份,以SQL Server來說是
Create PK同時就會建立該PK的Index
(Sorry,我只接觸過Oracle & SQL Server)
Oracle在DB Object上的處理態度是比較彈性的,並不會因為
Create PK就同時建立Index,而Oracle 在Index上提供了
1. Unique Index
2. Nomal Index
其實兩者的差別就只在於Unique Index在Insert動作時,
會先驗證是否唯一(如同PK)而已。
(Index就有唯一效果了,何必再建PK,Oracle自家的ERP也幾乎不建
PK)
但有一種情況要注意,若在Oracle Table上建立了PK & Unique Index,
在PL/SQL中對該Table進行DML動作當違反PK限制時(因為Table會先進行
PK的驗證),在PL/SQL並無法使用Exception捕抓錯誤,而是整個PL/SQL
會產生這個錯誤而程式Rollback,無法自行利用PL/SQL來控管邏輯流程。
(這段測試的DB版本是9.2.07,或許10g or 11g不會有這個問題)
: 這兩個問題 還麻煩大家解答!
: 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.117.142.152
※ 編輯: fantasyj 來自: 59.117.142.152 (07/09 22:26)
※ 編輯: fantasyj 來自: 59.117.142.152 (07/09 22:32)
推 bohei:先謝謝fantasyj大的回答,另外我在oracle上 先設PK 再建index 07/09 22:40
→ bohei:是無法建立index的, 還有另外一個問題是,如果不設PK 那是用 07/09 22:41
→ bohei:constrant 來限制NOT NULL嗎 因為雖然在建立TABLE時不設PK 07/09 22:43
→ bohei:在ID的那個欄位還是希望是NOT NULL吧?這樣才能利用ID來搜尋 07/09 22:44
欄位設定不允許null不用Constrant..通常Create Table時就會先宣告了...
ex:
Create Table test is
(test_id number not null
,a varchar2(240) not null);
or 事後
Alter Table test Modify(a NOT NULL);
※ 編輯: fantasyj 來自: 59.117.142.152 (07/09 23:46)
※ 編輯: fantasyj 來自: 59.117.142.152 (07/09 23:48)
※ 編輯: fantasyj 來自: 59.117.142.152 (07/09 23:48)
→ fantasyj:DML語法先研究一下吧, 這比您上面Index的觀念更基本.. 07/09 23:49