約束和索引的區別


 

Constraint

約束被 DB2 Universal Database(DB2 UDB) 用來對數據業務規則和數據完整性進行實施、維護。約束的作用范圍僅限在當前數據庫,通過檢索‘數據庫目錄’和‘命令方式’(select * from user_constraints)可以查看到約束信息。如果想方便、快捷的訪問約束信息,Control Center也是種方式。約束可以被當做數據庫對象來處理,它們具有名稱和關聯模式(creator ID)。

約束的五種類型: 
一、主鍵約束(primary key constraint) 
主鍵創建時默認會自生成約束,也可通過顯示聲明。 
alter table stuInfo add constraint PK_stuNo primary key (stuNo) 
/* 主鍵可以是一列或多列的組合用以唯一標識表中某行數據。*/

二、外鍵約束(foreign key constraint) 
外鍵創建時默認會自生成約束,也可通過顯示聲明。 
alter table stuMarks add constraint FK_stuNo foreign key(stuNo) references stuinfo(stuNo) 
/* 主表stuInfo 從表stuMarks */

三、檢查約束(check constraint) 
alter table stuInfo add constraint CK_stuAge check (stuAge between 15 and 40) 
/* 年齡限制在15-40歲之間 */

四、唯一約束(unique constraint) 
alter table stuInfo add constraint UQ_stuID unique(stuID) 
/* 身份證號唯一 */

五、默認約束(default constraint) 
alter table stuInfo add constraint DF_stuAddress default (‘地址不詳’) for stuAddress 
/* 地址信息不填,默認為地址信息不詳 */

六、信息約束(informational constraint) 
/* 不是由DB2管理器來負責實施SQL 編譯器可用它來提高查詢性能 */


Index

索引是一個單獨和物理地並存儲在數據頁上的數據庫結構,它是表中一列或若干列值的集合和相應的指向表中數據值的物理標識數據頁的邏輯指針清單。索引的存在會增加數據庫的存儲空間,也會使插入、修改數據的時間開銷變多(因為索引也要隨之變動)。注:索引可常駐內存進行處理

在這些列上創建索引: 
在經常需要搜索的列上,可以加快搜索速度;在主鍵列上,強制該列的唯一性和組織表中數據的排列結構;在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接速度;在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序;在經常使用where子句中的列上面創建索引,加快條件的判斷速度。

不應該創建索引的列: 
對於在查詢中很少使用和參考的列不應該創建索引。增加索引會降低系統的維護速度和增大空間需求;對於數據值很少的列也不應增加索引。由於這些列的取值很少,例如:人事表的性別列,在查詢結果中,結果集的數據行占了表中數據行的很大比例,在表中搜索的數據行的比例很大,索引不能明顯加快檢索速度;對於定義為text, image和bit數據類型的列不應該增加索引。因為這些列的數據量要么相當大,要么很少;當修改性能遠遠大於檢索性能時,不應該創建索引。修改性能和檢索性能是互相矛盾 的。索引會提高檢索性能,但是會降低修改性能。

索引的分類–按結構分 
索引按照結構可以分為有序索引(ordered index)和散列索引(hash index)兩種基本類型。其中有序索引是基於值的順序排序,根據值的排序進行索引值的查找。而散列索引則是基於將值平均分布到若干散列桶(hash bucket)。根據散列函數確定索引值所在的散列桶。 
一、有序索引:稠密索引、稀疏索引、多級索引和B+樹索引。 
二、散列索引:靜態散列、散列桶、散列函數、桶溢出和動態散。

索引的分類–按功能分 
一、唯一索引(unique index)和非唯一索引(nonunique index) 
create unique index indexname on table tabname(colname) 
/* 允許值為空,但不允許存在的值重復 */

二、主鍵索引(primary index) 
/* 唯一索引+非空約束=主索引,主鍵創建時會默認自生成索引 */

三、集群索引(clustered index)和非集群索引(nonclustered index) 
create index indexname on table tabname(colname desc) cluster 
/* desc降序排列,在沒有注明情況下默認是按asc升序排列 */

集群索引是按物理結構排序的,它會對表中的數據進行重新排序,所以表中只能有一個該索引。數據庫管理器會嘗試按照相應鍵在索引頁面中的順序來保存數據到頁面中。如果對表進行了重組,那么會按照索引鍵的順序將數據插入數據頁面中,數據庫管理器不會維護數據的任何順序。

集群索引具有查詢優勢和插入上的疲軟。由於需要保持索引值和數據行的物理順序一致,插入數據時會進行大量遷移,為防止此種情況出現,我們允許聚簇索引存在無序狀態,當聚簇率低於85%時就得進行重組

DB2集群索引的葉結點和非集群索引一樣,都是指向相應數據頁的邏輯指針。即索引數據頁和常規數據頁是嚴格分開的。但是包括Oracle,SQL Server在內的大部分數據庫的聚簇索引的頁結點不是指向數據頁的指針,而是葉結點本身就是數據頁。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM