SQL> create table tab_idx(id int,name varchar2(24)); Table created. SQL> desc tab_idx; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) NAME VARCHAR2(24) SQL> create unique index unidx_name on tab_idx (name); Index created. SQL> insert into tab_idx values(0,'arcerzhang'); 1 row created. SQL> insert into tab_idx values(1,'arcerzhang'); insert into tab_idx values(1,'arcerzhang') * ERROR at line 1: ORA-00001: unique constraint (SCOTT.UNIDX_NAME) violated SQL>
SQL> create table tab_idx2 (id int,name varchar2(24)); Table created. SQL> create index unidx_name_2 on tab_idx2(name); Index created. SQL> insert into tab_idx2 values(0,'arcerzhang'); 1 row created. SQL> insert into tab_idx2 values(1,'arcerzhang'); 1 row created. SQL> commit; Commit complete. SQL> select * from tab_idx2; ID NAME ---------- ------------------------ 0 arcerzhang 1 arcerzhang SQL>
CREATE INDEX i ON t (a,bc,) REVERSE;
用戶能夠在REBUILD子句後添加NOREVERSE關鍵字講一個逆序鍵索引(reverse key index)轉換爲常規的索引:併發
ALTER INDEX i REBUILD NOREVERSE;
若是REBUILD子句後沒有使用NOREVERSE關鍵字,那麼逆序鍵索引(reverse key index)被重建後仍將保持逆序.oracle
bitmap index -> 適合DSS系統.(特色:不會常常地、頻繁地更新);對於bitmap index對應的列數據,常常的更新,致使cpu負荷加大,鎖競爭激烈.app
b-tree index -> 適合OLTP系統.(特色:常常、頻繁地更新;)less
索引的目標是爲用戶提供指向包含特定鍵值(key value)的數據行的指針.在常規的索引中,Oracle將各行的鍵值及與此鍵值對應的一組ROWID存儲在一塊兒,從而實現了上述目標.而在位圖索引(bitmap index)中,只須要存儲每一個鍵值的位圖(bitmap),而非一組ROWID.ide
位圖中的每一位對應一個可能ROWID.若是某一位被置位,則代表這與此對應的ROWID所指向的行中包含此位所表明的的鍵值.oracle經過一個映射函數(mapping function)將位信息轉化爲實際的ROWID,所以雖然位圖索引內部的存儲結構與常規索引不一樣,但她一樣能實現常規索引的功能.當不一樣值的索引鍵的數量較少時,位圖索引的存儲效率至關高.(男\女).函數
若是在WHERE子句內引用的多個列上都建有位圖索引(bitmap index),那麼進行位圖索引掃描時(bitmap indexing)能夠將各個位圖索引融合咋一塊兒.不知足所有條件的行能夠被預先過濾掉.所以位圖索引可以極大地提升查詢的響應時間.性能
數據倉庫應用中位圖索引的優點大數據
數據倉庫應用(data warehousing application) 的特色是數據量巨大,執行的多爲自定義查詢(ad hoc query),且併發事務較少.這種環境下使用位圖索引(bitmap index)具有以下優點:spa
爲一個大表創建傳統的平衡樹索引(B-tree index)可能佔用極大的存儲空間,索引有可能比數據表還要大數倍.而創建一個位圖索引(bitmap index)所佔的空間比被索引數據還要小得多.3d
位圖索引(bitmap index)不適用與OLTP系統,由於這樣的系統中存在大量對數據進行修改的併發事務.位圖索引主要用於數據倉庫系統中(data warehourcing)的決策支持功能,在這種環境下用戶對數據的操做主要是查詢而非修改.
主要進行大於(greater than)或小於(less than)比較的列,不適宜使用位圖索引(bitmapt index)。例如,WHERE子句中常會將salary列和一個值進行比較,此時更適合使用平衡樹索引(B-tree index)。位圖索引適用等值查詢,尤爲是存在AND,OR,NOT等邏輯操做符的組合時.
bitmap index適合基數較小的列,b-tree index適合基數較大的列.
舉例說明:一張表包含100w條數據,其中的一列包含一萬個不相同的值,就能夠考慮在此列上建立位圖索引.此列上位圖索引的查詢性能將超過 b-tree index,當此列與其餘列做爲組合條件時效果尤其明顯.假如一張表中包含100w條數據,其中一列中存放是的身份帳號嗎,那麼此列千萬不要建立bitmap index,而是建立b-tree index.
位圖索引能夠包含鍵值爲NULL的行.
用戶能夠在分區表上建立位圖索引的前提是分區表必須是本地的,只有非分區表才能使用全局位圖索引.
位圖示例
客戶編號 | 婚姻情況 | 地區 | 性別 | 收入水平 |
101 | 單身 | 東部 | 男性 | 一級 |
102 | 已婚 | 中部 | 女性 | 四級 |
103 | 已婚 | 西部 | 女性 | 二級 |
104 | 離異 | 西部 | 男性 | 四級 |
105 | 單身 | 中部 | 女性 | 二級 |
106 | 已婚 | 中部 | 女性 | 三級 |
地區=‘東部’ | 地區='中部' | 地區='西部' |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 1 | 0 |
業務分析員在統計公司客戶的地區分佈趨勢時,須要知道"住在中部或西部地區的已婚客戶有多少"?查詢SQL以下:
SELECT COUNT(*) FROM CUSTOMER WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west');