zoukankan      html  css  js  c++  java
  • 索引 split2

    1. 当往一个已经满了的索引块中插入新的索引条目时,将发生索引块的split,在9i下,分两种不同的情况进行split:  
    2.   
    3. (1)如果插入的索引键值不是最大的,将发生50-50的split,也就是说有block中一半的索引键值将被移到一个新的block中。  
    4.   
    5. 就是说热点增长也始终在热点的右边,导致类似右手增长状况。但是由于不在最有边,将按照50:50 Split,导致接近50%的空间浪费。  
    6.   
    7.   
    8. (2)如果插入的索引键值是最大的,将发生99-1的split,也就是把新插入的索引键值放在一个新的block中。  
    9. 测试如下:  
    10. 1. 完全按照升序的方式进行索引的插入  
    11. SQL> drop table t1;  
    12. Table dropped.  
    13. SQL> create table t1 (name varchar2(10),nr number) pctfree 0;  
    14. Table created.  
    15. SQL> create index i1 on t1(nr);  
    16. Index created.  
    17. SQL> declare  
    18.   2    i number;  
    19.   3  begin  
    20.   4    for i in 1..50000  
    21.   5    loop  
    22.   6      insert into t1 values('XX',i);  
    23.   7    end loop;  
    24.   8  end;  
    25.   9  /         
    26. PL/SQL procedure successfully completed.  
    27.   
    28. SQL>  analyze index i1 validate structure;  
    29. Index analyzed.  
    30. SQL> select blocks, lf_blks, pct_used from index_stats;  
    31.     BLOCKS    LF_BLKS   PCT_USED  
    32. ---------- ---------- ----------  
    33.        104         99         99  
    34. 这种情况下,每次当需要往一个已经满了的block中插入新的键值时,发生的是99-1的split,把新的键值放到一个新的block中,每个索引块的空间得到充分的利用。  
    35. 2. 将数据分两批插入,先插入一部分键值较大的数据,插入时按照升序方式,后插入一部分键值较小的数据,插入时也是按升序方式  
    36. SQL> drop table t2;  
    37. Table dropped.  
    38. SQL> create table t2 (name varchar2(10),nr number) pctfree 0;  
    39. Table created.  
    40. SQL> create index i2 on t2(nr);  
    41. Index created.  
    42. SQL> declare  
    43.   2    i number;         
    44.   3  begin  
    45.   4    for i in 25000..50000  
    46.   5    loop  
    47.   6      insert into t2 values('XX',i);  
    48.   7    end loop;  
    49.   8    for i in 1..25000  
    50.   9    loop  
    51.  10      insert into t2 values('XX',i);  
    52.  11    end loop;  
    53.  12  end;  
    54.  13  /  
    55. PL/SQL procedure successfully completed.  
    56.   
    57. SQL> analyze index i2 validate structure;  
    58. Index analyzed.  
    59. SQL> select blocks, lf_blks, pct_used from index_stats;  
    60.     BLOCKS    LF_BLKS   PCT_USED  
    61. ---------- ---------- ----------  
    62.        256        146         68  
    63. 在这种情况下,空间的利用率只有68%,leaf block达到了146个,可以推断发生了索引块的split,但并不是所有的block都发生了50-50的split,因为其利用率大于50%  
    64. 3.为了证明split时,确实发生的是50-50的split,可以在插入时采用完全降序的方式:  
    65. SQL> create table t3 (name varchar2(10),nr number) pctfree 0;  
    66. Table created.  
    67. SQL> create index i3 on t3(nr);  
    68. Index created.  
    69. SQL> declare  
    70.   2    i number;         
    71.   3  begin  
    72.   4    for i in reverse 1..50000  
    73.   5    loop  
    74.   6      insert into t3 values('XX',i);  
    75.   7    end loop;  
    76.   8  end;  
    77.   9  /  
    78. PL/SQL procedure successfully completed.  
    79.   
    80. SQL> analyze index i3 validate structure;  
    81. Index analyzed.  
    82. SQL> select blocks, lf_blks, pct_used from index_stats;  
    83.     BLOCKS    LF_BLKS   PCT_USED  
    84. ---------- ---------- ----------  
    85.        256        200         50  
    86. 这种情况下,空间利用率恰为50%,这也充分说明,采用降序插入的方式,每次发生split时,其方式都是50-50。 

    http://www.cnblogs.com/zhaoyangjian724/p/3797856.html

  • 相关阅读:
    .NET Core使用RabbitMQ
    微信openid和unionid区别
    .Net Core 中GC的工作原理
    .Net Core服务监控报警指标上报Prometheus+Grafana
    .Net Core基础的健康检查
    了解数据库的四种隔离级别
    IdentityServer使用ssl证书生成token
    IdentityServer客户端授权模式
    IdentityServer用户名密码模式
    IdentityServer4学习笔记汇总(实现传送门在底部)
  • 原文地址:https://www.cnblogs.com/seasonzone/p/4159730.html
Copyright © 2011-2022 走看看