ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle学习总结--基础部分(存储与索引)

Oracle学习总结--基础部分(存储与索引)

原创 Linux操作系统 作者:regonly1 时间:2008-05-21 21:59:28 0 删除 编辑

Oracle学习
block、extent、segment的概念
一般的block,现在都是8K的,但也有的系统有16K的,少的4K的我也碰到过。
在4K的环境下执行一些大文件的导入及大表的操作是非常令人痛苦的。
很多情况下,大数据量的dmp文件导入,最终都会以失败而告终。
block是oracle的基本存储单位,是最小的存储单元。
一般一个block可以存储若干条记录(具体多少随字段的多少及每个字段的长度而不同)。
所以在创建表空间、表或索引等对象的时候会有这么几个参数与block相关的:
pctfree N: 指的是在指定的这个段(segment)的区(extent)中,控制每个block中保留用于update的空间,
    当block中的free space小于pctfree时,将该block从freelist中去除。
pctused N: 这个参数在索引中是没有的,指的是对object做过DML操作后,free space的值大于pctused值
    时,将该block加回到free list中。

举例说明:
Oracle 数据库的读取单位是数据块(Block),而一个Block 是否允许被写入数据
是基于一定的空闲度,这就是大家知道的pctfree 和pctused 存储参数设置。
假设pctfree=10, pctused=40 , 这就表明当一个Block 的空间使用率达到了90%
(10-pctfree)时,这个block 就不再允许被用于新增数据(insert),而保留下来的这10%
的空间则被预留为行更新(update)所可能需要的空间扩展,我们说此时这个block 就从
freelist 上被摘走了(实际上还有另外一种情况,就是当块剩余空间不足以插入一条记录并
且该块的使用率已经超过了pctused 定义的值并且该块位于freelist header 处时,该块也会
从freelist 上被摘走,术语称为UNLINK)。当有数据删除(delete)的时候,只有该block
中的数据被删除到一定的程度,该块才会重新被加入到freelists 中,而这个程度就是pctused
参数定义的数值,如我们这个例子中,只有块中的数据降低到40%以下的时候,该块才被
重新允许用于新增数据。


free list是指Oracle中的一个可使用的block的列表,当某个block达到指定条件不再可以插入或更新数据时
将从这个列表中去除。当某个block由于DML操作而可以插入或更新数据时,又会被添加到该列表中。

比如说要创建一个表:
create table abc(id integer)
tablespace dvbcetus --指定表空间为dvbcetus
pctfree 5  --默认值为5
pctused 40  --默认值为40
mintrans 1  --最小可并发查询数, default 1
maxtrans 255  --最大可并发查询数,default 255
storage(  --存储参数
  initial 10m  --初始获取的
  next 10m  --下一次扩展的大小
  minextent 1 --可获得的最小的区的数量
  maxextent unlimited  --可获得的最大的区的数据,unlimited是指无限制
  pctincrease 0  --指定每次next增长的系数,默认为0,建议为0,算法: next = next(1+n)
)

如何查询:
使用dbms_rowid来实现block的查询, 输出如下:
SQL> select dbms_rowid.rowid_object(sub.rowid) "data_object_id",
  2         dbms_rowid.rowid_relative_fno(sub.rowid) "rfile#",
  3         dbms_rowid.rowid_block_number(sub.rowid) "block_number",
  4         dbms_rowid.rowid_row_number(sub.rowid) "row_number"
  5  from ow_subscriber sub
  6  where rownum <= 10
  7  ;
 
data_object_id     rfile# block_number row_number
-------------- ---------- ------------ ----------
          7468          7        13317         78
          7468          7        13328         69
          7468         12        10610          3
          7468         12        10610          0
          7468         12        10610          1
          7468         12        10610          2
          7468         12        10610          4
          7468         12        10610          5
          7468         12        10610          6
          7468         12        10610          7
 
10 rows selected
其中对于rowid的简单说明,rowid是一个由18个64进制的字符组成的字符串(8i以后),共10个字节(32bit + 10bit rfile# + 22bit + 10bit),表示形式为:
OOOOOO FFF BBBBBB RRR
O: 指data_object_id,一个object可能跨越多个数据文件, 与下面的rfile#合起来就能对应一个block的所在数据文件,32bit;
F: 指相对file_id, 在非cluster(RAC)模式下,rfile#与file_id是相同的,10bit,即文件可以显示的最大的个数为2^10-1=1023个;
B: 指block id, 即某个数据块,22bit,即一个文件下最大可容纳的block为2^22-1个,如果一个block为8k,则文件的大小最大只能为:(2^22-1)*8/1024/1024=32G;
R: 指的是每个行的标号,即row number, 16bit,如果一行的长度为200byte,则一个block可容纳的row为:8k*1024/20=40个row。

注意:
rowid的字节长度跟字符串的长度不是同一个概念
rowid的字节长度是指这个rowid字符串可容纳的字节数,而字符串长度则是指所有字符加起来的总长度,在这里即为18;


如何dump某个数据块的内容:
alter system dump datafile 39 block 4106;
alter system dump datafile [file_id] min block [block_id] max block [block_id];

 


索引的概念
一、二叉树索引
通常的索引都是指B*树索引,即常说的二叉树索引
二叉树索引是将不同的数据排序后,以树形结构的方式存储在数据库中,查询的时候可根据一层层节点最终找到叶子节点。
二叉树索引是使用的最广泛的索引,是Oracle中默认的。对于高基数(high-即重复的数据很少)且非空的或为空的数据很少的列来说比较适合;
创建方式如下:
create index [idx_name] on [table_name]([column_name]) tablespace [index_tablespace] [nologging/logging] [local]
说明:
1、通过指定nologging参数,有如下好处:减少重做日志空间大小;比默认建索引方式快;;
2、local参数是在分区表的时候使用的,指定该参数用来实现本地分区索引;
3、tablespace [index_tablespace]参数可以不指定,默认情况下会建在用户的默认表空间下。


二、位图索引
位图索引适合于基数较小的列,也就是重复数据很多。假如有学位这个字段,有学士、硕士、博士、壮士这四个内容组成,这样的字段就适于位图索引。
但是位图索引对DML操作的代价比价大,需要花很多的时间来维护索引,因此位图索引通常适合于查询系统,
而不是业务运行系统那种数据DML操作很多的情况。


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12932950/viewspace-293458/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-10

  • 博文量
    257
  • 访问量
    1069976