復合索引和一般索引的問題

2021-09-30 10:12:07 字數 2751 閱讀 3344

sql code

--建立表

create

table

test1(id

number

, varchar2(10

));insert

into

test1

values(1

,'索引測試1');

commit;--

建立索引

create

index

ix_id

ontest1(id);

create

index

ix_id_name

ontest1(id, name);

drop

index

ix_id_name;

drop

index

ix_id;

--檢視解釋計畫

select

*from

test1

where

id =

1;

--where條件中只有id列

--1.當ix_id、ix_id_name都存在時,使用的是:ix_id_name。 解釋計畫如下:

select

statement, goal

=all_rows 11

25index

range scan mytest ix_id_and_name 11

25--

2.當只有ix_id存在時,使用的是:ix_id 解釋計畫如下:

select

statement, goal

=all_rows 21

25table

access

byindex

rowid cms0322_en test1 21

25index

range scan mytest ix_id 11

我的問題是:

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

復合索引 復合索引順序選擇問題

color red b 注意!在較高版本的oracle中不存在下述的問題!b color 復合索引第乙個原則 字首性 prefixing color red 復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。如復合索引為 ename,job,mgr 只要...

DataFrame 索引和復合索引

前面按照多個條件進行分組產生的索引是復合索引 一 索引 a 獲取index df.index b 指定index df.index c 重新設定index df.reindex a b c 注意 一般不用 d 指定某一列作為index df2 df1.set index o drop false d...

復合索引和多個單列索引的區別

多個單列索引 在每個需要索引的字段上設定乙個索引 復合索引 根據查詢需求在多個字段設定乙個索引 區別 1 多個單列索引實現簡單,那個字段需要就在 加,而復合索引的話,需要根據需求,考慮好索引順序設定索引。2 再查詢中,如果查詢條件使用where連線的,則多個單列索引中只有乙個索引會生效,而復合索引在...