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