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');