index

/*建立惟一索引(unique index)*/

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> 
往unique index上插入相同數值.

/*建立非惟一索引(nounqiue index)*/

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>           
往nounqiue index插入相同數值.

/*建立逆序索引*/ 

CREATE INDEX i ON t (a,bc,) REVERSE;
View Code

/*將逆序索引轉換爲常規索引*/

用戶能夠在REBUILD子句後添加NOREVERSE關鍵字講一個逆序鍵索引(reverse key index)轉換爲常規的索引:併發

ALTER INDEX i REBUILD NOREVERSE;
View Code

若是REBUILD子句後沒有使用NOREVERSE關鍵字,那麼逆序鍵索引(reverse key index)被重建後仍將保持逆序.oracle

位圖索引bitmap index 

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

  • 可以減小大數據量自定義查詢的響應時間
  • 與其餘索引技術相比能節省大量存儲空間
  • 即便硬件配置較低也能顯著提升性能
  • 有利於並行DML和並行加載

爲一個大表創建傳統的平衡樹索引(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');

相關文章
相關標籤/搜索