1、oracle索引空值問題
當在有空值得列上建立單列索引時,如果搜索條件為 is null 在解釋計劃中可以看到,對於此列oracle並沒有使用索引查詢;
但是當建立的是多列索引是,就會按照索引來進行查詢。
2、B-樹索引
示意圖:

在B-樹索引中,將會按照從上到下的順序進行索引。如果列的選擇度不低的話,索引掃描就會很慢。原因就在於要遍歷很多的葉子快來取出不同的行編號。
隨著出入數據的增多,最右側的葉子塊也在一直的增大,可能會導致緩沖區的繁忙等待。這種類型的最右側索引的快速增長被稱為 右側增長索引 。後面將談到一些解決方法。
3、位圖索引
位圖索引不適合用於需要大量DML操作的表(DML指除select以外的SQL語句)。適合用於大多數數據具有較少的唯一的列進行的只讀運算的數據倉庫表。
位圖索引要注意的一點是。更新一個具有位圖索引的列,必須要更新位圖索引。
4、分區索引
4.1、局部索引
局部索引使用LOCAL關鍵字來建立。
create index index_name on table_name (column_name) local;
當用到分區索引的時候,會直接查找匹配分區的內容,而不是查詢每個分區。
4.2、全局索引
全局索引用GLOBAL來創建
4.3、散列分區
回歸到B-數索引中所說到的右側增長索引問題,就可以用散列分區的方式來進行分區。
與范圍分區的方式不同散列分區是把所有的數據均勻的分布在不同的分區內。具體方法如下:
--范圍分區
create table table2
partition by range(year)
(partition p_2012 values less than (2013),
partition p_2013 values less than (2014),
partition p_2014 values less than (2015),
partition p_max values less than (maxvalue)
)
as
select * from table1;
--散列分區
drop sequence sf;
create sequence sf cache 200;
drop table table3;
create table table3
partition by hash(sid)
partitions 32
as
select sf.nextval sid,t.* from table1 t;
--通過以下代碼可以查到
select dbms_rowid.rowid_object(rowid) obj_id,count(*) from table3
group by dbms_rowid.rowid_object(rowid);
OBJ_ID COUNT(*)
---------- ----------
86232 4717
86236 4571
86240 4696
86257 4633
86234 4547
86235 4580
86241 4717
86249 4589
86250 4612
86251 4623
86261 4742
86238 4578
……
create unique index index_table3_sid on table3(sid) local;
select * from table3_sid where sid =10000;
--查看其解釋計劃,可以得到

5、壓縮索引
壓縮索引是B-樹索引的一個變體,更適合於引導列中具有重復值的列
create index index_name on table_name(column1,column2,column3) compress N;
其中N為壓縮前幾項。例如N=2就是壓縮column1,column2這兩項索引。
壓縮索引適用於引導列具有較少唯一值的索引。
6、基於函數的索引
create create index index_name on table_name(function_name(column1));
在select是必須加上function_name(column1)才能使用索引,只用column1的話,還是全表掃描。
7、反轉鍵索引
也是一種解決右側增長索引問題的一種方法,但是因為索引是反轉的所以不能使用范圍運算符
create index index_name on table_name (column_name) global reverse;
不常用,因為會引起其他的一些負面影響