1. 程式人生 > >DB2中的索引(Index)和約束(Constraint)

DB2中的索引(Index)和約束(Constraint)

索引:
可通過 SYSCAT.INDEXES JOIN SYSCAT.INDEXCOLUSE來查詢
索引的欄位有升序ASC和降序DESC,分別表示為SYSCAT.INDEXES的COLNAMES中索引欄位前的“+”和“-”。
SYSCAT.INDEXES中的UNIQUERULE可能為:D/U/P,分別代表:
  1. 普通索引(Duplicates Allowed)
  2. 唯一索引(Unique)
  3. 主鍵索引(Primary Index)
按型別索引可分為聚簇/非聚簇索引。
聚簇索引中,索引樹的葉級頁包含實際的資料,即記錄的索引順序與物理順序相同,理論速度比非聚簇索引快。
  1. 提升了SQL中包含範圍謂詞查詢語句的執行效率。如:Between...and, <, <=, >, >=。
  2. 提升了使用Group by或Order by的查詢語句的效率。
  3. 每個表只能有一個聚簇索引。
非聚簇索引中,記錄標識儲存在資料結構中,葉級頁指向標中的記錄,即記錄的物理順序與邏輯順序沒有必然的聯絡。

約束:

主鍵,外來鍵,唯一約束
唯一約束與唯一索引的區別是:唯一索引允許且僅允許一個null值。

可通過 SYSCAT.TABCONST JOIN SYSCAT.KEYCOLUSE來查詢。
建立約束時,系統會檢測是否有相同規則(列集相同,各列的順序不必相同)的索引存在:
若存在,則將索引轉化為對應的約束型別(Primary/Unique);
若不存在,則自動建立一個同名索引,但如果該名字已被使用,則會在SYSIBM的Schema下建立一個同型索引。

因此,當刪除一個與約束規則一致的索引時可能會報錯:
DB2 Database Error: ERROR [42917] [IBM][DB2/AIX64] SQL0669N  A system required index cannot be dropped explicitly.  SQLSTATE=42917
必須先刪除對應的約束後才能刪除索引。

而當指令碼中有同名的索引和約束時,必須先建立索引,再建立約束,否則建立約束時會導致後面的同名索引無法建立。