ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引块的split

索引块的split

原创 Linux操作系统 作者:lsq_008 时间:2009-05-18 14:16:18 0 删除 编辑

当往一个已经满了的索引块中插入新的索引条目时,将发生索引块的split,在9i下,分两种不同的情况进行split:
(1)如果插入的索引键值不是最大的,将发生50-50的split,也就是说有block中一半的索引键值将被移到一个新的block中。
(2)如果插入的索引键值是最大的,将发生99-1的split,也就是把新插入的索引键值放在一个新的block中。
测试如下:

1. 完全按照升序的方式进行索引的插入

SQL> drop table t1;

Table dropped.

SQL> create table t1 (name varchar2(10),nr number) pctfree 0;

Table created.

SQL> create index i1 on t1(nr);

Index created.

SQL> declare
  2    i number;
  3  begin
  4    for i in 1..50000
  5    loop
  6      insert into t1 values('XX',i);
  7    end loop;
  8  end;
  9  /       

PL/SQL procedure successfully completed.

SQL>  analyze index i1 validate structure;

Index analyzed.

SQL> select blocks, lf_blks, pct_used from index_stats;

    BLOCKS    LF_BLKS   PCT_USED
---------- ---------- ----------
       104         99         99

这种情况下,每次当需要往一个已经满了的block中插入新的键值时,发生的是99-1的split,把新的键值放到一个新的block中,每个索引块的空间得到充分的利用。

2. 将数据分两批插入,先插入一部分键值较大的数据,插入时按照升序方式,后插入一部分键值较小的数据,插入时也是按升序方式

SQL> drop table t2;

Table dropped.

SQL> create table t2 (name varchar2(10),nr number) pctfree 0;

Table created.

SQL> create index i2 on t2(nr);

Index created.

SQL> declare
  2    i number;      
  3  begin
  4    for i in 25000..50000
  5    loop
  6      insert into t2 values('XX',i);
  7    end loop;
  8    for i in 1..25000
  9    loop
 10      insert into t2 values('XX',i);
 11    end loop;
 12  end;
 13  /

PL/SQL procedure successfully completed.

SQL> analyze index i2 validate structure;

Index analyzed.

SQL> select blocks, lf_blks, pct_used from index_stats;

    BLOCKS    LF_BLKS   PCT_USED
---------- ---------- ----------
       256        146         68

在这种情况下,空间的利用率只有68%,leaf block达到了146个,可以推断发生了索引块的split,但并不是所有的block都发生了50-50的split,因为其利用率大于50%

3.为了证明split时,确实发生的是50-50的split,可以在插入时采用完全降序的方式:

SQL> create table t3 (name varchar2(10),nr number) pctfree 0;

Table created.

SQL> create index i3 on t3(nr);

Index created.

SQL> declare
  2    i number;      
  3  begin
  4    for i in reverse 1..50000
  5    loop
  6      insert into t3 values('XX',i);
  7    end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL> analyze index i3 validate structure;

Index analyzed.

SQL> select blocks, lf_blks, pct_used from index_stats;

    BLOCKS    LF_BLKS   PCT_USED
---------- ---------- ----------
       256        200         50
这种情况下,空间利用率恰为50%,这也充分说明,采用降序插入的方式,每次发生split时,其方式都是50-50。


以上测试基于9.2.0.4环境

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-598667/,如需转载,请注明出处,否则将追究法律责任。

下一篇: shrink机制初探
请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1245729