程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle復合B*tree索引branchblock內是否包含非先導列鍵值?

Oracle復合B*tree索引branchblock內是否包含非先導列鍵值?

編輯:Oracle教程

Oracle復合B*tree索引branchblock內是否包含非先導列鍵值?


好久不碰數據庫底層細節的東西,前幾天,一個小家伙跑來找我,非要說復合b*tree index branch block中只包含先導列鍵值信息,並不包含非先導列鍵值信息,而且還dump了branch block,用以證明他的說法,從常理和SQL的語句執行信息就可以知道,他的說法是有問題的,但如何證明這一點呢?為了證明這點,也麻煩一次,玩玩多年不碰的dump。下面是他證明自己觀點的兩個dump結果(一個為單鍵索引,另一個是復合索引):

\

\

下面是本人的測試過程和結果:

create table t1(c1 int,c2 int,c3 int,c4 char(2000),c5 char(2000));

create index t1_idx1 on t1(c1,c2,c3,c4,c5);

<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+YmVnaW48L3A+CjxwPmZvciBpIGluIDEuLjEwMDAgbG9vcDxicj4KaW5zZXJ0IGludG8gdDEgdmFsdWVzKDAsMCxpLA=="aa','aa');
end loop;
end;
/

begin
for i in 1001..2000 loop
insert into t1 values(0,i,i,'bb','bb');
end loop;
end;
/

select segment_name,file_id,block_id
from dba_extents
where segment_name='T1_IDX1'
and extent_id=0;


alter system dump datafile 4 block 195;

trc文件內容:


由此可見,復合b*tree index branch block中,有時不包含非先導列鍵值,但有時包含。那麼,什麼情況下包含,什麼情況下不包含呢?實驗結果為,當先導列鍵值的選擇性足夠好時,就無需包含非先導列的鍵值,不然,也是浪費branck block寶貴的空間;只有當先導列的鍵值選擇性不足夠好,必須結合非先導列的鍵值才能定位到下一級block時,才需要包含非先導列的鍵值,該測試過程此處略去,感興趣的同學可以按照這個思路自己測試。

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