[201112114]index leaf node 50-50 split
index leaf node 50-50 split
[201112114]index leaf node 50-50 split.txt
當索引leaf滿分裂時,存在兩種情況:
1.如果插入的鍵值是最大值,分裂按照90-10 split.
2.如果不是,按照50-50分裂。
如何大量出現50-50的分裂呢?實際上的測試的例子很簡單,如果先插入一個異常大的鍵值,插入鍵值是線性增加的,就可以模擬大量50-50的分裂然後如下:
1.建立測試表:
select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
create table t1(a varchar2(5),b varchar2(10));
create unique index i_t1_a on t1(a);
2.插入一個異常數值:
insert into t1 values ('99999','test');
commit;
--插入一個異常大的數值。
3.繼續新增資料:
select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SID STATISTIC# VALUE NAME
---------- ---------- ---------- ----------------------------------------------------------------
11 382 0 leaf node splits
11 383 0 leaf node 90-10 splits
begin
for i in 1..10000 loop
insert into t1 values (lpad(to_char(i),5,'0') ,'test');
end loop;
end;
/
commit;
select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SQL> select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SID STATISTIC# VALUE NAME
---------- ---------- ---------- ----------------------------------------------------------------
11 382 39 leaf node splits
11 383 0 leaf node 90-10 splits
可以發現索引節點分裂39次,而leaf node 90-10 splits=0次。
4.分析索引結構:
SQL> analyze index i_t1_a validate structure;
set linesize 200;
set linesize 200;
column name format a10
select HEIGHT, BLOCKS, NAME, LF_ROWS, LF_BLKS, LF_ROWS_LEN, LF_BLK_LEN, BR_ROWS, BR_BLKS, BR_ROWS_LEN, BR_BLK_LEN, DEL_LF_ROWS, DEL_LF_ROWS_LEN, DISTINCT_KEYS from index_stats;
select MOST_REPEATED_KEY, BTREE_SPACE, USED_SPACE, PCT_USED, ROWS_PER_KEY, BLKS_GETS_PER_ACCESS, PRE_ROWS, PRE_ROWS_LEN, OPT_CMPR_COUNT, OPT_CMPR_PCTSAVE from index_stats;
HEIGHT BLOCKS NAME LF_ROWS LF_BLKS LF_ROWS_LEN LF_BLK_LEN BR_ROWS BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN DISTINCT_KEYS
---------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- ----------- --------------- -------------
2 48 I_T1_A 10001 40 160016 7996 39 1 401 8028 0 0 10001
MOST_REPEATED_KEY BTREE_SPACE USED_SPACE PCT_USED ROWS_PER_KEY BLKS_GETS_PER_ACCESS PRE_ROWS PRE_ROWS_LEN OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
----------------- ----------- ---------- ---------- ------------ -------------------- ---------- ------------ -------------- ----------------
1 327868 160417 49 1 3 0 0 0 0
可以發現PCT_USED=49,索引空間的利用率很低。
可以說明如果應用中某個索引鍵值正常業務時是線性增加的,比如順序號,或者日期等,如果表中存在某個異常數值,這樣索引空間的利用率會很低,因為由於插入資料的索引鍵值都是正常業務的"最大值",每次插入都是在索引一端,而每次都比異常數值小,這樣索引的分裂都是50-50的情況。
這種情況最容易出現一些日期欄位,因為如果應用業務的操作人員不小心輸入錯誤,輸入2032年等等情況,而這些垃圾資料沒有清除,這樣很容易出現這種情況.如果索引重整,不消除這些垃圾資料,以後的情況依舊大部分是50-50分裂。
[201112114]index leaf node 50-50 split.txt
當索引leaf滿分裂時,存在兩種情況:
1.如果插入的鍵值是最大值,分裂按照90-10 split.
2.如果不是,按照50-50分裂。
如何大量出現50-50的分裂呢?實際上的測試的例子很簡單,如果先插入一個異常大的鍵值,插入鍵值是線性增加的,就可以模擬大量50-50的分裂然後如下:
1.建立測試表:
select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
create table t1(a varchar2(5),b varchar2(10));
create unique index i_t1_a on t1(a);
2.插入一個異常數值:
insert into t1 values ('99999','test');
commit;
--插入一個異常大的數值。
3.繼續新增資料:
select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SID STATISTIC# VALUE NAME
---------- ---------- ---------- ----------------------------------------------------------------
11 382 0 leaf node splits
11 383 0 leaf node 90-10 splits
begin
for i in 1..10000 loop
insert into t1 values (lpad(to_char(i),5,'0') ,'test');
end loop;
end;
/
commit;
select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SQL> select a.*,b.name from v$mystat a , v$statname b where a.statistic#=b.statistic# and b.name like '%leaf%';
SID STATISTIC# VALUE NAME
---------- ---------- ---------- ----------------------------------------------------------------
11 382 39 leaf node splits
11 383 0 leaf node 90-10 splits
可以發現索引節點分裂39次,而leaf node 90-10 splits=0次。
4.分析索引結構:
SQL> analyze index i_t1_a validate structure;
set linesize 200;
set linesize 200;
column name format a10
select HEIGHT, BLOCKS, NAME, LF_ROWS, LF_BLKS, LF_ROWS_LEN, LF_BLK_LEN, BR_ROWS, BR_BLKS, BR_ROWS_LEN, BR_BLK_LEN, DEL_LF_ROWS, DEL_LF_ROWS_LEN, DISTINCT_KEYS from index_stats;
select MOST_REPEATED_KEY, BTREE_SPACE, USED_SPACE, PCT_USED, ROWS_PER_KEY, BLKS_GETS_PER_ACCESS, PRE_ROWS, PRE_ROWS_LEN, OPT_CMPR_COUNT, OPT_CMPR_PCTSAVE from index_stats;
HEIGHT BLOCKS NAME LF_ROWS LF_BLKS LF_ROWS_LEN LF_BLK_LEN BR_ROWS BR_BLKS BR_ROWS_LEN BR_BLK_LEN DEL_LF_ROWS DEL_LF_ROWS_LEN DISTINCT_KEYS
---------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------- ---------- ----------- --------------- -------------
2 48 I_T1_A 10001 40 160016 7996 39 1 401 8028 0 0 10001
MOST_REPEATED_KEY BTREE_SPACE USED_SPACE PCT_USED ROWS_PER_KEY BLKS_GETS_PER_ACCESS PRE_ROWS PRE_ROWS_LEN OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
----------------- ----------- ---------- ---------- ------------ -------------------- ---------- ------------ -------------- ----------------
1 327868 160417 49 1 3 0 0 0 0
可以發現PCT_USED=49,索引空間的利用率很低。
可以說明如果應用中某個索引鍵值正常業務時是線性增加的,比如順序號,或者日期等,如果表中存在某個異常數值,這樣索引空間的利用率會很低,因為由於插入資料的索引鍵值都是正常業務的"最大值",每次插入都是在索引一端,而每次都比異常數值小,這樣索引的分裂都是50-50的情況。
這種情況最容易出現一些日期欄位,因為如果應用業務的操作人員不小心輸入錯誤,輸入2032年等等情況,而這些垃圾資料沒有清除,這樣很容易出現這種情況.如果索引重整,不消除這些垃圾資料,以後的情況依舊大部分是50-50分裂。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-713269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解index leaf node 90-10 splitIndex
- 唯一index和非唯一index中leaf node裡rowid的一點區別。Index
- index branch and leaf block structure(轉)IndexBloCStruct
- index desc之後資料在leaf node中是如何儲存的!Index
- Oracle索引分裂(Index Block Split)Oracle索引IndexBloC
- Oracle index索引塊分裂split資訊彙總OracleIndex索引
- index block split相關一些知識IndexBloC
- Leaf
- index leaf block索引葉子塊何時會刪除—part1IndexBloC索引
- mysql中substring_index類似split分組功能MySqlIndex
- mysql函式substring_index實現split切割效果MySql函式Index
- 【Oracle 12c Flex Cluster專題 】— Leaf Node的故障遷移OracleFlex
- [20220124]index split level.txtIndex
- zt_如何確定index root block split索引塊分裂的時間點IndexBloC索引
- Leaf for Mac RSS閱讀器Mac
- JavaScript split()JavaScript
- Awk split
- split 例子
- split partition
- Edge Split
- Leetcode Sum Root to Leaf NumbersLeetCode
- [Day2] Node.js利用Express訪問index.htmlNode.jsExpressIndexHTML
- Leaf-分散式ID生成系統分散式
- Sum Root to Leaf Numbers leetcode javaLeetCodeJava
- git subtree splitGit
- Hbase split的三種方式和split的過程
- 分散式 ID 解決方案之美團 Leaf分散式
- golang Leaf 遊戲伺服器框架簡介Golang遊戲伺服器框架
- Swift Web 開發之 Vapor – 模版 Leaf(三)SwiftWebVapor
- php中split()用法PHP
- Split Array Largest Sum
- split相當好使
- os.path.split
- java split用法 案例Java
- php中的chunk_split()和str_split()字串函式PHP字串函式
- KEEP INDEX | DROP INDEXIndex
- Leaf:美團分散式ID生成服務開源分散式
- LeetCode之Leaf-Similar Trees(Kotlin)LeetCodeMILAKotlin