复合索引和一般索引的问题
http://topic.csdn.net/u/20100504/11/ae713245-155d-4a13-85a7-23661c80afc6.html
SQL code
我的問題是:
1.如果一般索引和復合索引均包含某一列時(如:ix_id_name和ix_id有共同的列:id),當where條件中只有id列時,使用的索引一定是復合索引嗎?
2.復合索引和一般索引的效率,哪個高些?為什么?
3.復合索引和一般索引所占的空間哪個大些?
4.如果有復合索引了,還有創建一般索引的必要嗎?
這里我使用:
select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('ix_id_name')
select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('ix_id');
結果是一樣大,這樣測試有誤嗎?
==============================answers
1.不一定
2.關鍵看你的條件中是否使用到復合索引中的其它列。
3.一般來說,復合索引
4.針對復全索引的首列沒必要再建單索引
==============================
1:復合索引有引導列的概念,一般來說,只有where條件中包含引導列才可能使用符合索引(索引跳躍掃描除外),另外,要看你查詢的所有列是否包含在復合索引中,如果包含,則走復合索引,否則應該是走單列索引。
2:索引的效率高不高要看你的具體應用,一般來說,能用單列索引實現的就不要用復合索引,復合索引占空間、維護麻煩、效率還低。
3:當然是復合索引占空間大
4:如果你的where條件始終是id,那么只需要一種索引就可以。
?
?測試是對的,不過測試之前最好分析一下索引,analyze index index_name validate structure;
?你的數據量太小,測試不出差別。
=============================
| 1:肯定不是,ORALCE按照索引使用規則進行判斷走哪個索引 2:沒有絕對的,當你覺得使用單索引或者使用復合索引效率高的話,可以加/* */提示,強行按照自己的意圖走所以 3:復合索引空間占用大, 4:當你覺得一般索引的效率比當前復合索引的效率高的時候就可以建立一般索引 |
================================
表: test1(id number, name varchar2(10))
這個表只有2個字段。
1)
create index ix_id on test1(id);
上面這個索引,只有id一個字段
select * from test1 where id = 1; --where條件中只有id列
可見,ORACLE掃描了索引,但是索引段中沒有NAME字段,所以得通過索引中的ROWID訪問以得到NAME這個字段的數據
2)
create index ix_id_name on test1(id, name);
上面這個索引,有ID,NAME
select * from test1 where id = 1; --where條件中只有id列
這個時候,索引段中已經有id,name2個字段,可以直接從索引段中找到全部數據了,所以無需再訪問表的數據段
通過比較1)和2)的執行計劃,你就可以發現1)多做了一步從表段中取數據的步驟。
顯示,2)的效率要比1)快,而且快很多
==========================
看oracle優化文檔,CBO啊,要收集統計信息
如果查詢表的數據全能從索引中獲取,那么會直接讀索引不用讀表了,當然要符合一定的條件,比如至少有一個索引列not null
?
總結
以上是生活随笔為你收集整理的复合索引和一般索引的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE复合索引使用 注意事项
- 下一篇: let finger cross