• 索引 split2


    当往一个已经满了的索引块中插入新的索引条目时,将发生索引块的split,在9i下,分两种不同的情况进行split:
    
    (1)如果插入的索引键值不是最大的,将发生50-50的split,也就是说有block中一半的索引键值将被移到一个新的block中。
    
    就是说热点增长也始终在热点的右边,导致类似右手增长状况。但是由于不在最有边,将按照50:50 Split,导致接近50%的空间浪费。
    
    
    (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。
    

  • 相关阅读:
    mysql中timestamp自动更新
    Jquery JQZoom Plugin 放大鏡效果 Two
    ASP.NET MVC 之路(一)HtmlHelper 擴展控件
    我的第一个控件
    Visifire Silverlight Chart 比 Silverlight Toolkit Chart 好的兩點
    Jquery Magnify Plugin 放大鏡效果 One
    Asp.Net MVC 之路(二)Html Helper擴展之二
    一个信仰从此在这里开始(仅此篇是非技术)
    HelloWord之WCF文件的猫咪形式
    第一话 Asp.Net MVC 3.0【Hello World!】
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352285.html
Copyright © 2020-2023  润新知