LMT and ASSM

LMT的管理方式

LMT就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况。每个表文件头会有64K用于bit map。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部的这个记录,反映这个变化

区大小的管理
extent_management_clause(表空间级参数)
AUTOALLOCATE(默认值)
区的大小由系统来管理,如果数据块小于16K.则默认是64K,如果大于16K,则默认是1M.然后再根据表的情况分配区。大小是64K,1M,8M..
而系统表空间只能是autoallocate。
UNIFORM
规定了每个区的大小,而每个区至少包括5个数据库块大小

区属性的管理
segment_management_clause(表空间级参数)
MANUAL
用free lists来管理段空间
AUTO
这种段的管理方式也称为automatic segment-space management.它是用位图来管理段空间,
会忽略对像的PCTUSED, FREELIST和FREELIST GROUPS参数。oracle会自动管理表和索引的FREELISTS。对于ASSM而言,INITIAL最小的值是三个块。

下面就详细的说说ASSM
传统的管理方式中。PCTUSED的设置影响着freelist的联接。如果我们想充分的利用disk。就会设一个大大高于avg_row_len的value.相反,如果我们想提高insert的性能,我们就要设一个低的PCTUSED,确保所有的block有足够的空间来实现数据的更新。如果PCTUSED设置不合理,就会导致insert性能的降低。如果PCTUSED设置过大。使得新的数据无法在当前的块中更新,就必需去freelist中获取的别的。从而提高了I/O的争用。如果经过5次获取都无法insert这个数据,那oracle就会将HWM提高5块的空间。把这5个块分配给这个Insert使用。

用ASSM管理方式。oracle就会根据dba_tables.avg_row_Len来调整PCTUSED的大小。从而使性能提高。使用ASSM的最大的好处就是减少缓冲忙的等待。在oracle9i以前的版本中,缓冲忙的等待是最主要的问题。如果是用单个freelist的时候。oracle会在表头用一个块来管理表中空闲的块。如果多个用户向同一个表insert数据,oracle会向table的freelist申请空闲的块,每次只能处理一个请求。这样就会造成等待。

由于ASSM使用位图来管理空闲的块。一个对像中,文件头会占三个块,其中有一个是位图信息。打个比方,在一个表中,如果区大小是64K,那么前面16个块由第一个位图块管理,然后第17个块又是位图块,来管理17到31个数据块。以此类推。

如果是64K/区,那么,一个位图块管理16个数据块
如果是1M/区,那么,一个位图块管理64个数据块
如果是8M/区,那么,一个位图块管理256个数据块

 

补充说明TS定义为LMT,并且指定尺寸的时候(uniform size )的分配方法:
这是我做试验测试得到的结论,欢迎指正。

WINDOWS 2000 SERVER,ORACLE9205,DB_BLOCK_SIZE = 8K

1、当为TS指定UNIFORM SIZE 时,TS对在其上面创建的对象的EXTENT都统一
用此尺寸去划分大小,多留少补。

2、当为表指定NEXT,PCTINCREASE 时,这些参数只在创建时有效,之后
的扩展无效。

举例:创建一表空间,
CREATE TABLESPACE ASSM DATAFILE 'D:/oracle/oradata/encore/ASSM01.DBF'
SIZE 50M AUTOEXTEND OFF
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 3M
SEGMENT SPACE MANAGEMENT AUTO;

UNIFORM SIZE 为 3M

创建一表:CREATE TABLE ASSMTAB3 (COL1 NUMBER(3))
STORAGE (INITIAL 2M NEXT 5M MINEXTENTS 3 PCTINCREASE 100)
TABLESPACE ASSM;

查看创建结果

SQL> SELECT SEGMENT_TYPE, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS FROM USER_EXTENTS
2 WHERE SEGMENT_NAME = 'ASSMTAB3';

SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
------------------ ------------------------------ ---------- ---------- ----------
TABLE ASSM 0 3145728 384
TABLE ASSM 1 3145728 384
TABLE ASSM 2 3145728 384
TABLE ASSM 3 3145728 384
TABLE ASSM 4 3145728 384
TABLE ASSM 5 3145728 384

SQL> select table_name,INITIAL_EXTENT,NEXT_EXTENT,PCT_INCREASE from user_tables
2 where table_name = 'ASSMTAB3';

TABLE_NAME INITIAL_EXTENT NEXT_EXTENT PCT_INCREASE
------------------------------ -------------- ----------- ------------
ASSMTAB3 17825792 3145728 0


INITIAL_EXTENT = 17825792B = 17M

可以看得出,这些参数 INITIAL 2M NEXT 5M MINEXTENTS 3 PCTINCREASE 100
确实有效:(2)+(5)+(5+5*100%) = 17 M
而由于 UNIFORM SIZE = 3M,所以必须 6 个 EXTENT 才可以满足(3M*6=18M)要求。

也就是说:这些参数在创建时是有效的,ORACLE使用统一的尺寸(3M)来为其分配EXTENT



再看看当初试分配的空间使用完后,NEXT EXTENT的分配情况:

往该表插入数据
SQL> begin
2 for i in 1..350000 loop
3 insert into ASSMTAB3 select 'swwwwwwwssssssssssssssssssssssssssssssssssssssssssssss' from dual;
4 end loop;
5 commit;
6 end;
7 /

PL/SQL procedure successfully completed.

SQL> SELECT SEGMENT_TYPE, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS FROM USER_EXTENTS
2 WHERE SEGMENT_NAME = 'ASSMTAB3';

SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
------------------ ------------------------------ ---------- ---------- ----------
TABLE ASSM 0 3145728 384
TABLE ASSM 1 3145728 384
TABLE ASSM 2 3145728 384
TABLE ASSM 3 3145728 384
TABLE ASSM 4 3145728 384
TABLE ASSM 5 3145728 384
TABLE ASSM 6 3145728 384

7 rows selected.

比之之前的,多了一个EXTENTS,大小为3M,也就是说,此时PCTINCREASE 100 已经不起作用了,
ORACLE 一次只分配一个3M的EXTENT给该表。

这样看来,一开始的 INITIAL 2M NEXT 5M MINEXTENTS 3 PCTINCREASE 100,实际上和
INITIAL 17M 没什么两样。ORACLE仍旧会使用SIZE 3M的尺寸标准来分配空间

从这个意义上讲,NEXT,MINEXTENTS,PCTINCREASE等这些参数确实失效了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值