• 索引(index)是資料庫物件的一種。索引的關鍵在於通過一組排序後的實體地址作為鍵來取代預設的全表掃瞄檢索方式,就像為書本新增目錄,通過犧牲物理記憶體的方式提高資料的檢索效率。
• 它對使用者時透明的,它的建立不會影響對錶的sql操作。索引一旦建立,在表上進行dml操作時(例如在執行插入、修改或者刪除相關操作時),oracle會自動管理索引。
• oracle建立主鍵時會自動建立索引
1.建立預設索引
create unique index (索引名稱) on 表名 (列名1,列名2...) ; --unique(預設)表示唯一索引
2.修改索引
alter index (舊索引名稱) rename to(新索引名稱);
3.刪除索引
drop index (索引名稱);
4.檢視索引
檢視某錶的所有索引:
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);
b樹索引是oracle最常見的的索引,它的原理是利用了b-樹的資料結構(b樹的原理:
b樹索引結構圖:
b樹的所有葉子節點擁有相同的深度,oracle將索引列和對應的rowid值存入葉子節點上,因此所有的檢索速度基本都是相同的。
b樹索引的不適用場景:
不適合鍵值較少的列(重複資料較多的列)
假如索引列type有5個鍵值,如果有1萬條資料,那麼 where type = 1將訪問表中的2000個資料塊。再加上訪問索引塊,一共要訪問大於200個的資料塊。
如果全表掃瞄,假設10條資料乙個資料塊,那麼只需訪問1000個資料塊,既然全表掃瞄訪問的資料塊少一點,肯定不會利用b樹索引了。
(不過,事實上,當取出的行資料占用表中大部分的資料時,即使新增了b樹索引,資料庫如oracle、mysql也不會使用b樹索引,很有可能還是一行行全部掃瞄)
位圖索引是對列的每個鍵值設定乙個位圖。
比如有這樣一列a:
10 20 30 20 10 30 10 30 20 30
那麼會建立三個位圖,如下:
key=10 1 0 0 0 1 0 1 0 0 0
key=20 0 1 0 1 1 0 0 0 1 0
key=30 0 0 1 0 0 1 0 1 0 1
這適合於該列的基數非常小的情況,當建立位圖索引時,會為每個獨立的值建立向量,比如上面3個,就會建立3個向量:key=10: 1000101000,key=20: 0101100010...
如果再有一列b:
x y x x y y y x y
key = x : 1 0 1 1 0 0 0 1 0
key = y : 0 1 0 0 1 1 1 0 1
如果你對a列和b列使用 and 或者 or操作,這裡就會體現位圖索引使用bit的優勢:比如 "a=10 and b =x " :它會將 key=10 :100010100向量 和 b=x :101100010向量進行與操作,更快的取出索引對應的行。
適用場景:
和b樹索引相反,位圖索引適合鍵值重複率高的表,若重複值很低,則點陣圖索引相對的會需要大量資料。由於位圖索引採用0,1記錄某行是否包含該鍵值,因此非常適合and, or, not,count等這樣的邏輯操作。
位圖索引非常不適合有大量「寫」的操作,因為每乙個位圖鍵值中,都可能對於多條記錄,當修改一條記錄更新位圖鍵值時,會在對應的點陣圖索引鍵上加鎖,從而導致對其它記錄的修改也會被阻塞。
1. 如果有兩個或者以上的索引,其中有乙個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引
2. 至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第乙個列被where子句引用時,優化器才會使用該索引),因此最常查詢的列應該放在前面
3.小表不需要建立索引
4.列中有很多空值,但經常查詢該列上非空記錄時應該建立索引
5.經常進行連線查詢的列應該建立索引
6. long(可變長字串資料,最長2g)和long raw(可變長二進位制資料,最長2g)列不能建立索引
7.通常來說,表的索引越多,其查詢的速度也就越快。但是,表的更新速度則會降低。這主要是因為,在更新記錄的同時需要更新相關的索引資訊。為此,需要在這個更新速度與查詢速度之間取得乙個均衡點。同時過多的索引會增加物理記憶體,資料庫管理員需要定期去優化索引。
--下面的方式oracle不適用name索引
select * from student where name like '%wish%';
--如果萬用字元出現在字串的其他位置時,優化器能夠利用索引;如下:
select * from student where name like'wish%';
select * from student wherenot (score=100);
select * from student wherescore <> 100;
--替換為
select * from student wherescore>100 or score <100
select * from student where score is not null;
select * from student where score is null;
有乙個可以變通的方法,即我們在建立表的時候,為每個列都指定為非空約束(not null),並且在必要的列上使用default值
Oracle索引分析
analyze index時,validate structure和compute statistics的區別?analyze index index1 validate structure analyze index index1 compute statistics 在分析索引的時候,一般會用到...
oracle 索引使用
管理索引 單例索引 單例索引是基於單個列所建立的索引。create index 索引名 on 表名 列名 復合索引 復合索引是基於兩列或是多列建立的索引。create index emp idx1 on emp ename,job creat index emp idx1 on emp job,en...
oracle強制索引使用
強制索引格式 select tablename.from tablename table alias where fieldname 說明 index table alias indexname 必須出現在select 之後,字段之前 tablename 為表名,如果sql中表有別名,則必須使用表的...