Oracle数据库中索引树的结构与块尺寸

导读:关于Oracle数据库索引树的结构以及它们对Oracle性能调优是否重要存在大量的、激烈的争论,而且已经有很多文章试图来描述这些重要的Oracle性能工具的内部工作机制。

正如我们知道的,Oracle提供了大量索引结构,每种索引结构都有其好处和不足:

  1.    B树索引。从最早的Oracle发行版本开始,Oracle就一直使用的标准树索引就是B树索引。
  2.   位图索引。当某个索引列含有很少数量的不同的值(即低基数)时,使用位图索引。这对于那些只读数据库而言速度超快,但对需要经常性更新的系统不适合。
  3.    位图连接索引。这是针对来自其他表的数据列出现在某个连接表的多列索引时使用的索引。下面是在from子句和where子句中使用类似SQL的创建索引的惟一语法。

以下是代码片段:

  1.  create bitmap index   
  2.   part_suppliers_state   
  3.   on   
  4.   inventory( parts.part_type, supplier.state )   
  5.   from   
  6.   inventory i,   
  7.   parts p,   
  8.   supplier s   
  9.   where   
  10.   i.part_id=p.part_id   
  11.   and   
  12.   i.supplier_id=p.supplier_id;   

  尽管有关索引重建的争论仍在激烈进行着,但还是存在每个人都认可的索引管理的某些领域。在内部机制上,一个Oracle B-树索引的结构和一个UNIX I-结点的结构非常相似。索引中的每个数据块都是索引树中的一个结点,位于***部的结点(叶数据块)包含一对符号键和行ID值。

  Oracle b-树索引

  为了正确管理这些数据块,Oracle控制着每个数据块中指针的分配。随着一棵Oracle树的增长(通过往表里插入新行),Oracle会填充这个数据块,当这个数据块满时Oracle会分裂它,创建新的索引结点(数据块)来管理索引内的符号键。

因此,一个Oracle索引块可能包含以下两种类型的指针:

  1.    指向其他索引结点(数据块)的指针
  2.    指向数据库表中特定行的行ID指针

  Oracle管理着索引块内指针的分配,这就是为什么我们不能为索引指定一个PCTUSED值(自由列表重链接门槛)的原因。当我们检查一个索引块的结构时,我们发现每个索引结点内部条目的数量是下面两个值的一个函数:

  1. 符号键的长度

  2. 索引表空间的块尺寸

  由于块尺寸影响每个索引结点内部的符号键的数量,可以推理出:块尺寸对一棵索引树的结构也会有影响。在其他条件相同的情况下,采用32K的大数据块能容纳更多的符号键,从而能够比在2K表空间中创建的相同的索引更加平整。采用大的数据块也将减少索引访问期间一致获取的数量,从而提高分散读访问的性能。

  索引中的每个数据块包含索引树中的“结点”,位于***部的结点(叶数据块)包含一对符号键和行ID值。随着一棵Oracle树的增长(通过往表里插入新行),Oracle会填充这个数据块,当这个数据块满时Oracle会分裂它,创建新的索引结点(数据块)来管理索引内的符号键。因此,一个Oracle索引块可能包含指向其他索引结点或行ID/符号键对的指针。

索引行为和Oracle块尺寸

  由于块尺寸影响每个索引结点内部的符号键的数量,可以推理出:块尺寸对一棵索引树的结构也会有影响。在其他条件相同的情况下,采用32K的大数据块能容纳更多的符号键,从而能够比在2K表空间中创建的相同的索引更加平整。

  今天,大多数Oracle性能调优专家都利用Oracle提供的多种块尺寸的特色,因为它提供了缓冲区隔离和以最合适块尺寸来存放对象从而减少缓冲区浪费的能力。一些Oracle基准测试的世界记录都使用很大的数据缓冲区和多种块尺寸。

  根据《Oracle数据库管理员认证:“Oracle 认证数据库管理专家”教师指南》一书的作者Christopher Foot的一篇文章,更大的块尺寸在某些情况下非常有帮助:

  “更大的块尺寸意味着在B-树索引的分支结点中有更多的空间来存储符号键,从而可以降低树的高度和提高索引查询的性能。”

  在任何情况下,似乎有证据表明块尺寸影响树的结构,这为数据块影响树的结构提供了有力支持。

  你可以使用大数据块(16-32)缓冲区来存储来自作为重复性大规模扫描对象的索引或表中的数据。这真的会提高性能么?一个小的但透漏内情的测试能回答这个问题。

#p#

  在这个测试中,将对某个使用8K数据块尺寸的Oracle 9i数据库执行以下查询,这个数据库同时也使用16K缓冲区和16K大小的表空间。

以下是代码片段:
 

  1.  select   
  2.   count(*)   
  3.   from   
  4.   eradmin.admission   
  5.   where   
  6.   patient_id between 1 and 40000; 

以下是代码片段:

  1.  Execution Plan   
  2.   SELECT STATEMENT Optimizer=CHOOSE   
  3.   (Cost=41 Card=1 Bytes=4)   
  4.   1 0 SORT (AGGREGATE)   
  5.   2 1 INDEX (FAST FULL SCAN) OF 'ADMISSION_PATIENT_ID'   
  6.   (NON-UNIQUE) (Cost=41 Card=120002 Bytes=480008)   

 

以下是代码片段:
 

  1.  Statistics   
  2.   0 recursive calls   
  3.   0 db block gets   
  4.   421 consistent gets   
  5.   0 physical reads   
  6.   0 redo size   
  7.   371 bytes sent via SQL*Net to client   
  8.   430 bytes received via SQL*Net from client   
  9.   2 SQL*Net roundtrips to/from client   
  10.   0 sorts (memory)   
  11.   0 sorts (disk)   
  12.   1 rows processed   

  为了测试新的16K缓冲区和16K表空间的效果,将使用16K的表空间来重建这个查询所用的索引,16K的表空间和原来的8K的表空间相比,除了更大的块尺寸其他特性一模一样。

以下是代码片段:

  1.  alter index   
  2.   eradmin.admission_patient_id   
  3.   rebuild nologging noreverse tablespace indx_16k;   

  一旦在16K表空间中建立好这个索引,就再次执行这个查询(同样也是执行两次),会产生以下的运行时统计信息:

以下是代码片段:

  1.  Statistics   
  2.   0 recursive calls   
  3.   0 db block gets   
  4.   211 consistent gets   
  5.   0 physical reads   
  6.   0 redo size   
  7.   371 bytes sent via SQL*Net to client   
  8.   430 bytes received via SQL*Net from client   
  9.   2 SQL*Net roundtrips to/from client   
  10.   0 sorts (memory)   
  11.   0 sorts (disk)   
  12.   1 rows processed   

  正如你所看到的,逻辑读操作的次数被减少了一半,仅仅是由于使用了新的16K表空间和16K数据缓冲区。很显然,正确使用新的数据缓冲区和Oracle9i及其以上版本的多种块尺寸表空间的特色,很值得在你的数据库中被试验和研究。

定期进行索引重建?

  争论的另外一个领域是:是否存在一些确定的规则可以用来确定何时能够从索引重建中获取性能提高。许多使用Oracle的企业都定期进行索引重建,并声称在他们和重建他们的Oracle B-树索引后获得了相当大的速度提升。

  在“Oracle世界2003”上,展示了Sushil Kumar所著的一篇题为“Oracle数据库10g:自我管理的数据库”的文章,Kumar声明说Oracle10g的“自动维护任务”(AMT)特色将自动检测并重建潜在的***化的索引。

  “自动工作负载信息库(AWR)给oracle10g提供了关于数据库各种使用情况的详细信息。通过分析存储在自动工作负载信息库(AWR)中的信息,10g数据库可以决定是否需要执行数据库性能维护任务,比如优化器统计数字的刷新、重建索引等等。 以“自动维护任务”AMT为基础,oracle数据库可以自动执行这些操作。”

  尽管如此,仍有不少反对定期重建索引的论点。一些oracle内部的专家坚持认为oracle索引在空间重用和访问速度上是非常高效的,b-树索引在极少情况下才需要被重建。他们坚持认为逻辑输入输出的减少应该是可测量的,并且如果重建索引是有好处的,某些人应该已经提出了可以证明的规则。

结论

  多种数据块尺寸的特色能够提高Oracle索引的性能,而且在某些情况下重建索引可以提高查询速度,这是显而易见的。人们期望新的Oracle10g“自动维护任务”AMT允许自动检测并重建潜在的***化索引结构。希望上文中涉及到的内容对大家能够有所帮助。

【编辑推荐】

  1. Oracle数据库关闭方法总结
  2. Oracle数据库效率技巧:避免错误的索引
  3. ORACLE实例和ORACLE数据库详解
  4. Oracle数据库基本常识

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/298145.html<

(0)
管理的头像管理
上一篇2025-05-22 19:28
下一篇 2025-05-22 19:29

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注