oracle 9i index bug?

9i index bug.txt

1.建立表以及索引
SQL> select * from v$version ;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
PL/SQL Release 9.2.0.8.0 - Production
CORE    9.2.0.8.0       Production
TNS for 32-bit Windows: Version 9.2.0.8.0 - Production
NLSRTL Version 9.2.0.8.0 - Production

SQL> show rel
release 902000800

create table t1 (a number,b varchar2(10));
create table t2 (a number,b varchar2(10));
create table t3 (a number,b varchar2(10));
create unique index i_t1_a on t1(a);
create unique index i_t2_a on t2(a);
create unique index i_t3_a on t3(a);
--三个表结构完全一样!

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
--------- ---------- ---------- ------------------------------
      103        201          0 leaf node splits
      103        202          0 leaf node 90-10 splits

2.插入数据到t1(采用批量插入的模式).

insert into t1  select rownum,'test' from dual connect by level或者
begin
        for i in 1..10000         loop
                insert into t1 values (i,'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%';
       SID STATISTIC#      VALUE NAME
---------- ---------- ---------- ------------------------------
       103        201         17 leaf node splits
       103        202         17 leaf node 90-10 splits

analyze index i_t1_a validate structure;
@i
    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         24 I_T1_A          10000         18      139801       8000         17          1         170       8032           0               0         10000

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      152032     139971         93            1                    3          0            0              0                0

    从这里可以验证索引分裂了17次,每次都是leaf node 90-10 splits.pct_user=93,LF_BLKS=18 .

3.插入数据到t2(采用当次提交的模式,就是插入一条提交一次!),退出再进入,便于观察:
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
--------- ---------- ---------- ----------------------------
      103        201          0 leaf node splits
      103        202          0 leaf node 90-10 splits

begin
        for i in 1..10000         loop
                insert into t2 values (i,'test');
                commit;
        end loop;
end;
/

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
---------- ---------- ---------- ------------------------------
       103        201         33 leaf node splits
       103        202          0 leaf node 90-10 splits

--两者不同是一个批量插入,一个插入一条commit一条.

analyze index i_t2_a validate structure;
@i

    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         40 I_T2_A          10000         34      139801       8000         33          1         330       8032           0               0         10000

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      280032     140131         51            1                    3          0            0              0                0

    从这里可以验证索引分裂了33次,而每次都不是leaf node 90-10 splits(leaf node 90-10 splits=0).pct_user=51,LF_BLKS=34 .
    前后对比发现,后面的方式索引的使用很低,index split都是50-50 splits.导致索引占用空间很大.

4.插入数据到t3(采用每次提交5条记录的方式!),退出再进入,便于观察:

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
--------- ---------- ---------- ------------------------------
      103        201          0 leaf node splits
      103        202          0 leaf node 90-10 splits

begin
        for i in 1..10000         loop
                insert into t3 values (i,'test');
                if (mod(i,5) =0) then
                      commit;
                end if;
        end loop;
end;
/

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
---------- ---------- ---------- ------------------------------
       103        201         31 leaf node splits
       103        202          2 leaf node 90-10 splits

analyze index i_t3_a validate structure;
@i
    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         40 I_T3_A          10000         32      139801       8000         31          1         307       8032           0               0         10000

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      264032     140108         54            1                    3          0            0              0                0

    从结果看索引分裂31次,仅仅leaf node 90-10 splits=2次.pct_user=54,LF_BLKS=32 .
    仅仅比每次提交的情况好一点.可以测试每次插入N条的各种情况,有些好一些,有一些差一点.
    

5.结论:
    一般正常业务oltp,如果不是做多条记录的插入,而索引又是使用序列号,日期等做主键,而这些主键基本都是顺序递增的情况下,这样会导致这些索引占用空间很大,也许正是这个原因,导致许多人存在一个误区,索引要经常性rebuild,实际上以上测试在10g上不存在!

附录.查询index_stats的脚本i.sql
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;

 

时间: 2024-07-29 21:39:18

oracle 9i index bug?的相关文章

9i index bug.txt 之2

9i index bug.txt 之2 1.接着以上的测试: SQL> SELECT object_id FROM dba_objects WHERE object_name = 'I_T1_A'; OBJECT_ID----------     45851         To then do a treedump of the index: SQL> ALTER SESSION SET EVENTS 'immediate trace name treedump level 45851';S

Oracle 9i数据库服务器的体系结构

2.4.1 进程结构    Oracle 9i网络环境里共有两大类进程.    1. 用户进程    用户进程是在客户机内存上运行的程序,如客户机上运行的[SQL Plus].[企业管理器]等.用户进程向服务器进程提出操作请求.    2. 服务器进程    主要的服务器进程如表2.5所示.表2.5 Oracle 9i的主要后台支持进程 名称 主要作用 系统监控进程(SMON) 数据库系统启动时执行恢复性工作,对有故障数据库进行恢复 进程监控进程(PMON) 用于恢复失败的用户进程 数据库写入进

Oracle 9i 角色的管理

Oracle 9i预定义的角色 表8.2 Oracle 9i预定义的角色 角色名称 说明 CONNECT 数据库连接角色,用于连接数据库,具有创建簇.数据库链接.序列.同义词.表和视图,以及修改会话的权利 DBA 数据库管理员角色,具有所有使用ADMIN选项创建的系统权限,可以将系统权限授予其他用户或角色 DELETE_CATALOG_ROLE 删除目录角色,可以删除或重建数据字典 EXECUTE_CATALOG_ROLE 执行目录角色,能够执行所有系统包 EXP_FULL_DATABASE 能

Oracle 9i索引

  索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据块的I/O次数,因此可以显著提高性能. 索引的原理     下面通过查询数据表"scott.student"的ROWID列为例,在[SQLPlus Worksheet]中执行下面的语句,查询结果如图7.38所示.    ―――――――――――――――――――――――――――――――――――――    select rowid,student_id,name,pr

RHAS 3.0上的Oracle 9i的安装

oracle RHAS 3.0上的Oracle 9i的安装原文来自 :好好先生 llmmysun 修改后发布参考文档:http://www.puschitz.com/InstallingOracle9i.shtml 另外还参考了一篇csdn上的安装文档,在此一并表示感谢! 声明:本文可任意转载,但请保留上述信息     Oracle是世界上使用最广泛的数据库,它可以运行在各种计算机上:也是当前最优秀的关系型数据库.以前,一至无缘接触.这两天,正好有空.就在自己的计算机上装了一遍,领略了一番她的魅

oracle 9i 的内存泄漏问题

oracle|问题  近期在linux平台上写了一个程序需要通过oracle 9i的客户端调用PL/SQL, 在调试时发现有内存泄漏问题, 以为程序有bug, 检查了n遍也没有发现问题(呜呜,郁闷死了), 后来才找到资料说时oracle 9i的客户端有内存泄漏. 总结一下:1. 当程序为多进程模式时会出现内存泄漏,而且泄漏速度很快, 在单进程模式下(DEFAULT)就没有这个问题2. 只在UNIX和linux系统上出现, window系统上没有发现.3. 不管是pro*c和OCI都会有这个问题

JSP 连接 Oracle 9i

js|oracle 近日因项目原因,需要将手头的 系统转变为另一环境系统.即要将 Resin + Ms SQL 开发的JSP程序转为Weblogic + Oracle 下的JSP程序.Oracle我是六年前玩过它了,老早忘记怎么使用了.从合作项目公司拿来正版安装盘安装好后,忽然不知道如何用JSP连接Oracle了.打开搜索引擎狂搜,结果显然都是JDBC,Thin之类的代码. 懒人嘛,拿来测试测试.肯定是不行的了.郁闷好一个星期了,今天在搜索的时候,无意中发现跟我一样的菜鸟贴,按贴子指示,测试成功

Oracle 9i的特点

    Oracle 9i在集群技术.高可用性.商业智能.安全性.系统管理等方面都实现了新的突破,其特点主要包括如下内容.1.4.1 集群技术    集群的原理如图1.2所示.1.4.2 联机分析处理.数据挖掘和分析技术    1. 什么是联机分析处理    2. 什么是数据仓库    3. 什么是数据挖掘和分析    数据分析是从大量的数据中获取所需要的决策数据的技术.数据挖掘是从数据仓库中由数据分析工具主动发现并提取隐藏在数据仓库内部的信息的新技术.1.4.3 智能管理1.4.4 分布式

网络关系型数据库的代表Oracle 9i

1.3.1 Oracle 9i数据库    1. 企业版(Enterprise Edition)    2. 标准版(Standard Edition)    3. 个人版(Personal Edition)1.3.2 Oracle 9i应用服务器    Oracle 9i应用服务器有两种版本.    1. 企业版(Enterprise Edition)    企业版主要用于构建互联网应用,面向企业级应用.    2. 标准版(Standard Edition)    标准版用于建立面向部门级的