程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 詳談 oracle 索引 (筆記),詳談oracle

詳談 oracle 索引 (筆記),詳談oracle

編輯:Oracle教程

詳談 oracle 索引 (筆記),詳談oracle


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;

  不常用,因為會引起其他的一些負面影響

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved