作者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)
1F:推 bohei:先谢谢fantasyj大的回答,另外我在oracle上 先设PK 再建index 07/09 22:40
2F:→ bohei:是无法建立index的, 还有另外一个问题是,如果不设PK 那是用 07/09 22:41
3F:→ bohei:constrant 来限制NOT NULL吗 因为虽然在建立TABLE时不设PK 07/09 22:43
4F:→ 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)
5F:→ fantasyj:DML语法先研究一下吧, 这比您上面Index的观念更基本.. 07/09 23:49