Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92644843
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-15 13:09:09

    来源:赛迪网技术社区    作者:shangking

索引行为和Oracle块尺寸

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

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

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

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

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

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

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

select 
   count(*) 
from  
   eradmin.admission
where 
   patient_id between 1 and 40000;

表eradmin.admission含有150,000行数据,并在patient_id列上建立了一个索引。对上面的查询语句执行EXPLAIN命令揭示出:它使用索引范围扫描来产生想要的目的结果:

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

使用位于一个标准8K表空间的索引来执行这个查询(两次以消除分析活动并缓冲任何数据)产生了以下实时统计信息:

Statistics

          0  recursive calls
          0  db block gets
        421  consistent gets
          0  physical reads
          0  redo size
        371  bytes sent via SQL*Net to client
        430  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

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

alter index 
      eradmin.admission_patient_id 
      rebuild nologging noreverse tablespace indx_16k;

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

Statistics

          0  recursive calls
          0  db block gets
        211  consistent gets
          0  physical reads
          0  redo size
        371  bytes sent via SQL*Net to client
        430  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

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

阅读(244) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~