DB2中的索引(Index)和約束(Constraint)
阿新 • • 發佈:2019-02-07
索引:
可通過 SYSCAT.INDEXES JOIN SYSCAT.INDEXCOLUSE來查詢
索引的欄位有升序ASC和降序DESC,分別表示為SYSCAT.INDEXES的COLNAMES中索引欄位前的“+”和“-”。
SYSCAT.INDEXES中的UNIQUERULE可能為:D/U/P,分別代表:
聚簇索引中,索引樹的葉級頁包含實際的資料,即記錄的索引順序與物理順序相同,理論速度比非聚簇索引快。
唯一約束與唯一索引的區別是:唯一索引允許且僅允許一個null值。
可通過 SYSCAT.TABCONST JOIN SYSCAT.KEYCOLUSE來查詢。
建立約束時,系統會檢測是否有相同規則(列集相同,各列的順序不必相同)的索引存在:
若存在,則將索引轉化為對應的約束型別(Primary/Unique);
若不存在,則自動建立一個同名索引,但如果該名字已被使用,則會在SYSIBM的Schema下建立一個同型索引。
因此,當刪除一個與約束規則一致的索引時可能會報錯:
可通過 SYSCAT.INDEXES JOIN SYSCAT.INDEXCOLUSE來查詢
索引的欄位有升序ASC和降序DESC,分別表示為SYSCAT.INDEXES的COLNAMES中索引欄位前的“+”和“-”。
SYSCAT.INDEXES中的UNIQUERULE可能為:D/U/P,分別代表:
- 普通索引(Duplicates Allowed)
- 唯一索引(Unique)
- 主鍵索引(Primary Index)
聚簇索引中,索引樹的葉級頁包含實際的資料,即記錄的索引順序與物理順序相同,理論速度比非聚簇索引快。
- 提升了SQL中包含範圍謂詞查詢語句的執行效率。如:Between...and, <, <=, >, >=。
- 提升了使用Group by或Order by的查詢語句的效率。
- 每個表只能有一個聚簇索引。
約束:
主鍵,外來鍵,唯一約束唯一約束與唯一索引的區別是:唯一索引允許且僅允許一個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
而當指令碼中有同名的索引和約束時,必須先建立索引,再建立約束,否則建立約束時會導致後面的同名索引無法建立。