ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 3048|回复: 2

[原创] Oracle 12C LMT & ASSM 完美测试

[复制链接]
论坛徽章:
6
娜美
日期:2017-06-26 15:18:15目光如炬
日期:2017-08-20 22:00:00目光如炬
日期:2017-08-27 22:00:01火眼金睛
日期:2017-09-01 17:00:07目光如炬
日期:2017-09-03 22:00:01火眼金睛
日期:2017-09-30 22:00:01
发表于 2017-9-6 17:10 | 显示全部楼层 |阅读模式
本帖最后由 sunyunyi 于 2017-9-7 17:35 编辑



目前服务于电力行业,致力于帮助客户解决生产过程中出现的问题,提高生产效率, 爱好书法,周易!愿结交志同道合之士!共同进步! 微信号:sunyunyi_sun



version: 12.2.0.1.0

需要测试的表空间信息:

DBMS_METADATA.GET_DDL('TABLESPACE','DATA_01')
--------------------------------------------------------------------------------

  CREATE TABLESPACE "DATA_01" DATAFILE
  SIZE 5368709120
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT ---LMT  管理
  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO    ---ASSM 管理
   ALTER DATABASE DATAFILE
  '+DATA/test/datafile/data_01.400.952770489' RESIZE 32212254720

建立测试表
drop table user_sun.text_ext;
create table user_sun.test_ext tablespace data_01 as select * from dba_objects;
table meta info:
@meta:
CREATE TABLE "USER_SUN"."TEST_EXT"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(30)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255                         --PCTFREE 10 PCTUSED 40
  NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 --INITIAL 65536 NEXT 1048576 初始化64K next1M
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_01"

note:block size=8k

set lines 1200 pages 5000;
col owner for a12
col segment_name for a12
col segment_type for a10
select owner,segment_name,segment_type,file_Id,blocks,count(extent_id)
from dba_extents where segment_name='TEST_EXT'
group by owner,segment_name,segment_type,file_Id,blocks
order by blocks

OWNER        SEGMENT_NAME SEGMENT_TY FILE_ID BLOCKS COUNT(EXTENT_ID)
------------         ------------   ----------           ----------   ----------    ----------------
USER_SUN     TEST_EXT     TABLE               6          8               16
USER_SUN     TEST_EXT     TABLE               6        128               63
USER_SUN     TEST_EXT     TABLE               6       8192                4
USER_SUN     TEST_EXT     TABLE               6       1024              120
USER_SUN     TEST_EXT     TABLE               6        256                1
USER_SUN     TEST_EXT     TABLE               6       1920                1

前     16 个    extent  每个区大小为   8*8k  
接下来 63 个  extent  每个区大小为  128*8k
接下来 120 个 extent  每个区大小为  1024*8k
接下来  n 个   extent  每个区大小为  1024*8k

偶尔也有例外哦!!

again:

drop table user_sun.test_ext;
create table user_sun.test_ext tablespace data_01 as select * from dba_objects;
insert into user_sun.test_ext select * from user_sun.test_ext;
/
...

OWNER        SEGMENT_NAME SEGMENT_TY    FILE_ID     BLOCKS COUNT(EXTENT_ID)
------------ ------------ ---------- ---------- ---------- ----------------
USER_SUN     TEST_EXT     TABLE               6          8               16
USER_SUN     TEST_EXT     TABLE               6        128               63
USER_SUN     TEST_EXT     TABLE               6       1024              120
USER_SUN     TEST_EXT     TABLE               6       8192                4

新建表"USER_SUN"."TEST_EXT3"
修改
PCTFREE 90 PCTUSED 1
STORAGE(INITIAL 500k NEXT 10m

CREATE TABLE "USER_SUN"."TEST_EXT3"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(30)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 90 PCTUSED 1 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
  STORAGE(INITIAL 500k NEXT 10m MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_01"

insert into user_sun.test_ext3 select * from user_sun.test_ext;

OWNER        SEGMENT_     NAME  SEGMENT_TY    FILE_ID     BLOCKS COUNT(EXTENT_ID)
------------        ------------       ----------        ----------  ---------- ----------------
USER_SUN     TEST_EXT3    TABLE               6          8               16
USER_SUN     TEST_EXT3    TABLE               6        128               80
USER_SUN     TEST_EXT3    TABLE               6        256               24
USER_SUN     TEST_EXT3    TABLE               6        512                1
USER_SUN     TEST_EXT3    TABLE               6       1024              148
USER_SUN     TEST_EXT3    TABLE               6       2048               45
USER_SUN     TEST_EXT3    TABLE               6       6016                1
USER_SUN     TEST_EXT3    TABLE               6       8192              155


看看上面的结果出乎意料!

结果:
STORAGE(INITIAL 500k NEXT 10m ) 参数不起作用,LMT 下自动管理extent的分配策略

总结:
PCTFREE   :为将来更新已有行操作预留的空间比例。当剩余空间小于该值时block标记为非空闲,只能操作DEL和upd操作
PCTUSED :用于为插入新行预留的最小百分比,注意是最小!
在ASSM三级位图替换了8版本的freelist

三级位图原理:
L1 中记录有多少个extent,每个块的状态是free还是full
L2 中有多少个L1,每个L1的地址和L1的状态,其中状态分为以下7中情况:
   0 : unformatted
   1 : logically full
   2 : 0-25% full
   3 : 25-50% full
   4 : 50-75% full
   5 : 75-100% full
L3 中记录有多少个区,多少个块,高水位,第一个三级BMB地址,最后一个L1地址,最后一个L2地址,最后一个L3地址,
   extent map,Auxillary Map,Second Level Bitmap block DBAS.
L1 dump:
assm01.jpg

L2 dump
assml2.png
L3 dump
assml3.png

另外提供行链接和行迁移的检查方法:
SQL> select name,value from v$sysstat where name='table fetch continued row';  

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
table fetch continued row                                             25874

SQL> SQL> @?/rdbms/admin/utlchain
SQL> select count(*) from chained_rows;
SQL>analyze table USER_SUN.TEST_EXT3 list chained rows into chained_rows;
SQL> select count(*) from chained_rows; --是否有记录





论坛徽章:
6
娜美
日期:2017-06-26 15:18:15目光如炬
日期:2017-08-20 22:00:00目光如炬
日期:2017-08-27 22:00:01火眼金睛
日期:2017-09-01 17:00:07目光如炬
日期:2017-09-03 22:00:01火眼金睛
日期:2017-09-30 22:00:01
 楼主| 发表于 2017-9-6 17:37 | 显示全部楼层
本帖最后由 sunyunyi 于 2017-9-7 17:42 编辑

note:  DBA 转换问题:前十位为file_id 后22位为block_id
eg:
一般情况:能被4整除
Last Level 1 BMB:  0x04042d28 :
select to_number('040','xxx')/4 from dual;       file_id  = 16      --已经到16号文件
select to_number('42d28','xxxxxxx') from dual;   block_id = 273704
不能被整除:
DBA 188:   0x03f6d11b 的二进制位:0000 0011 1111 0110 1101 0001 0001 1011 前十位为file_id= 1111 =15 block_id=3592475


行迁移和行链接以及pctfree和pctused参数测试:

alter system set db_2k_cache_size=16m;

create tablespace tbs_L3
datafile '+data' size 8190M reuse blocksize 2048 --设置blocksize=2k
extent management local uniform size 10k
segment space management auto;


drop table tb_row_ext;

create table tb_row_ext
(
UNAME CHAR(10)  
)
tablespace tbs_L3
pctfree 50
initrans 1
maxtrans 255
;

insert into tb_row_ext values ('sunx');
commit;

alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_ROW_EXT;


set filename '/home/oracle/row6.dbf' blocksize 2048 mode edit

BBED> map
File: /home/oracle/row6.dbf (0)
Block: 1                                     Dba:0x00000000
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0      

struct ktbbh, 72 bytes                     @20      

struct kdbh, 14 bytes                      @100     

struct kdbt[1], 4 bytes                    @114     

sb2 kdbr[1]                                @118     

ub1 freespace[1910]                        @120     --空闲空间并不是pctfree 50

ub1 rowdata[14]                            @2030    --数据占用14字节

ub4 tailchk                                @2044   


由此看来pctfree和pctused 确实是不起作用的,oracle动态调整。

那么什么时候发生行链接:
drop table tb_row_ext;

create table tb_row_ext
(
UNAME CHAR(1000),
TNAME CHAR(810)  
)
tablespace tbs_L3
pctfree 50
initrans 1
maxtrans 255
;

insert into tb_row_ext values ('sunxianpeng','sun');
commit;

alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_ROW_EXT;

大量测试得到811时发生行链接,810没有行链接,

800时  ub1 freespace[115] 那么810就是 105个空闲,再增加一个字节就发生行链接

810时:
BBED> map
File: /home/oracle/row5.dbf (0)
Block: 1                                     Dba:0x00000000
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0      

struct ktbbh, 72 bytes                     @20      

struct kdbh, 14 bytes                      @100     

struct kdbt[1], 4 bytes                    @114     

sb2 kdbr[1]                                @118     

ub1 freespace[105]                         @120     

ub1 rowdata[1819]                          @225     

ub4 tailchk                                @2044   

105/1819=0.0577

pctfree这个参数应该有一个最小值大约为5%,!
测试发现,oracle 通过动态调整pctfree 尽量把行和列存储在一个数据块中。

例如:
drop table tb_row_ext;

create table tb_row_ext
(
UNAME CHAR(1820)
)
tablespace tbs_L3
pctfree 50
initrans 1
maxtrans 255
;

insert into tb_row_ext values ('sunxianpeng');
commit;

alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_ROW_EXT;

1708963:
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x78b
avsp=0x777
tosp=0x777
0xeti[0]      nrow=1  offs=0
0x12ri[0]     offs=0x78b
block_row_dump:
tab 0, row 0, @0x78b
tl: 13 fb: --H-F--N lb: 0x1  cc: 1
nrid:  0x041a13a2.0
col  0: [ 3]  73 75 6e
end_of_block_dump


0x041a13a2.0 =0000 010000 0110100001001110100010  file_id =16 block_d=1708962

block_row_dump:
tab 0, row 0, @0x61
tl: 1823 fb: -----LP- lb: 0x1  cc: 1
col  0: [1817]

1817+3=1820 这个例子因为一个块存不下一列数据,
所以存储在两个块中,其中一个块只存储3个块。


验证行迁移:

SQL> analyze table TB_ROW_EXT list chained rows into chained_rows;

Table analyzed.

SQL> select count(*) from chained_rows;

  COUNT(*)
----------
         2  --存在行链接

测试一定要严谨!

ASSM下 extent 扩展自动分配,块的自由空间也是自由调整!!




最近写的毛笔字:
微信图片_20170906174017.jpg



使用道具 举报

回复
论坛徽章:
6
娜美
日期:2017-06-26 15:18:15目光如炬
日期:2017-08-20 22:00:00目光如炬
日期:2017-08-27 22:00:01火眼金睛
日期:2017-09-01 17:00:07目光如炬
日期:2017-09-03 22:00:01火眼金睛
日期:2017-09-30 22:00:01
 楼主| 发表于 2017-9-20 14:35 | 显示全部楼层
本帖最后由 sunyunyi 于 2017-9-20 14:38 编辑

概述:
ORACLE 表空间管理分为
1:Locally Managed Tablespace :Automatic Segment Space Management 和 Manual Segment Space Management
2:Dictionary-Managed Tablespace 已经废弃

A locally managed tablespace maintains a bitmap in the data file header to track free
and used space in the data file body.
Each bit corresponds to a group of blocks. When space is allocated or freed, Oracle
Database changes the bitmap values to reflect the new status of the blocks.
注意上面这句话,LMT模式下每一个数据文件头有一个bitmap跟踪该数据文件的free block和 used block,且一个bit对应一组blocks,下面看看ASSM bitmap,
这两个一定要区分开!在oracle官方文档中有图如下所示:
lmt_bitmap.png
The automatic segment space management (ASSM) method uses bitmaps to manage
space in a tablespace.
assm 使用bitmaps 管理表空间里的段!!

The legacy manual segment space management (MSSM) method uses a linked list
called a free list to manage free space in the segment
MSSM使用链表管理段!!

1:测试 LMT EXTENT 的 分配策略:

需要测试的表空间信息:

DBMS_METADATA.GET_DDL('TABLESPACE','DATA_01')
--------------------------------------------------------------------------------

  CREATE TABLESPACE "DATA_01" DATAFILE
  SIZE 5368709120
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT ---LMT  管理
  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO    ---ASSM 管理
   ALTER DATABASE DATAFILE
  '+DATA/test/datafile/data_01.400.952770489' RESIZE 32212254720

建立测试表
drop table user_sun.text_ext;
create table user_sun.test_ext tablespace data_01 as select * from dba_objects;
table meta info:
@meta:
CREATE TABLE "USER_SUN"."TEST_EXT"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(30)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255                         --PCTFREE 10 PCTUSED 40
  NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 --INITIAL 65536 NEXT 1048576 初始化64K next1M
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_01"

note:block size=8k

set lines 1200 pages 5000;
col owner for a12
col segment_name for a12
col segment_type for a10
select owner,segment_name,segment_type,file_Id,blocks,count(extent_id)
from dba_extents where segment_name='TEST_EXT'
group by owner,segment_name,segment_type,file_Id,blocks
order by blocks

OWNER        SEGMENT_NAME SEGMENT_TY    FILE_ID     BLOCKS COUNT(EXTENT_ID)
------------ ------------ ---------- ---------- ---------- ----------------
USER_SUN     TEST_EXT     TABLE               6          8               16
USER_SUN     TEST_EXT     TABLE               6        128               63
USER_SUN     TEST_EXT     TABLE               6       8192                4
USER_SUN     TEST_EXT     TABLE               6       1024              120
USER_SUN     TEST_EXT     TABLE               6        256                1
USER_SUN     TEST_EXT     TABLE               6       1920                1

LMT AUTOALLOCATE 策略:
前     16 个    extent  每个区大小为   8*8k  
接下来 63 个  extent  每个区大小为  128*8k
接下来 120 个 extent  每个区大小为  1024*8k
接下来  n 个   extent  每个区大小为  8192*8k

偶尔也有例外哦!!

again:

drop table user_sun.test_ext;
create table user_sun.test_ext tablespace data_01 as select * from dba_objects;
insert into user_sun.test_ext select * from user_sun.test_ext;
/
/
/
这次比较听话!!

OWNER        SEGMENT_NAME SEGMENT_TY    FILE_ID     BLOCKS COUNT(EXTENT_ID)
------------ ------------ ---------- ---------- ---------- ----------------
USER_SUN     TEST_EXT     TABLE               6          8               16
USER_SUN     TEST_EXT     TABLE               6        128               63
USER_SUN     TEST_EXT     TABLE               6       1024              120
USER_SUN     TEST_EXT     TABLE               6       8192                4


2:测试 ASSM 下pctfree 参数有效性:

CREATE TABLESPACE "DATA_01" DATAFILE '+DATA';

@metatbs
DBMS_METADATA.GET_DDL('TABLESPACE','DATA_01')
------------------------------------------------------

  CREATE TABLESPACE "DATA_01" DATAFILE
  SIZE 104857600
  AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO

DBMS_METADATA:

CREATE TABLE "SYS"."TB_PCT"
   (    "C1" CHAR(1000),
        "C2" CHAR(1000),
        "C3" CHAR(1000),
        "C4" CHAR(1000),
        "C5" CHAR(1000),
        "C6" CHAR(1000),
        "C7" CHAR(1000),
        "C8" CHAR(500)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXT
ENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CEL
L_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_01"


insert into tb_pct values ('c1','c2','c3','c4','c5','c6','c7','c8');
commit;


alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_PCT;

@dpblk:

tl: 7951 fb: --H-FL-- lb: 0x1  cc: 8 --无行链接

BBED> set filename '/home/oracle/pct.dbf' blocksize 8192 mode edit

BBED> map
File: /home/oracle/pct.dbf (0)
Block: 1                                     Dba:0x00000000
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0      

struct ktbbh, 72 bytes                     @20      

struct kdbh, 14 bytes                      @100     

struct kdbt[1], 4 bytes                    @114     

sb2 kdbr[1]                                @118     

ub1 freespace[541]                         @120     

ub1 rowdata[7527]                          @661     

ub4 tailchk                                @8188   

剩余541字节,比例为6%,表定义为pctfree 10%,已经小于10%;


继续测试: 最终发现下面是临界值,925时发现行链接。
drop table tb_pct;

create table tb_pct
( c1 char(1000),
  c2 char(1000),
  c3 char(1000),
  c4 char(1000),
  c5 char(1000),
  c6 char(1000),
  c7 char(1000),
  c8 char(925)
) tablespace data_01;

insert into tb_pct values ('c1','c2','c3','c4','c5','c6','c7','c8');
commit;


alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_PCT;

0xeti[0]      nrow=1  offs=0
0x12ri[0]     offs=0x1ba4
block_row_dump:
tab 0, row 0, @0x1ba4
tl: 1012 fb: --H-F--- lb: 0x1  cc: 1
nrid:  0x044000ec.0 --行链接
col  0: [1000]


临界:

drop table tb_pct;
create table tb_pct
( c1 char(1000),
  c2 char(1000),
  c3 char(1000),
  c4 char(1000),
  c5 char(1000),
  c6 char(1000),
  c7 char(1000),
  c8 char(924)
) tablespace data_01;

insert into tb_pct values ('c1','c2','c3','c4','c5','c6','c7','c8');
commit;


alter system checkpoint;

select
dbms_rowid.rowid_relative_fno(rowid) ralative_fno,
dbms_rowid.rowid_block_number(rowid) block_number
from TB_PCT;

RALATIVE_FNO BLOCK_NUMBER
------------ ------------
          17          244
dump trace:
tl: 7951 fb: --H-FL-- lb: 0x1  cc: 8 --无行链接

asm cp asm datafile to file
BBED> set filename '/home/oracle/pct1.dbf' blocksize 8192 mode edit

BBED> map
File: /home/oracle/pct1.dbf (0)
Block: 1                                     Dba:0x00000000
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0      

struct ktbbh, 72 bytes                     @20      

struct kdbh, 14 bytes                      @100     

struct kdbt[1], 4 bytes                    @114     

sb2 kdbr[1]                                @118     

ub1 freespace[117]                         @120     

ub1 rowdata[7951]                          @237     

ub4 tailchk                                @8188   

8189-7924-117=148 也就是meta占用148个字节,剩余117个字节。

修改表结构:
alter table tb_pct modify c8 char(925);

alter system checkpoint;

dump block trace:
tl: 1012 fb: --H-F--- lb: 0x2  cc: 1 --block 244现在只存在一个列,其他列存在新块中地址为0x044000f5
nrid:  0x044000f5.0
col  0: [1000]

这里需要注意,一般update 产生行迁移,但是目前这种情况就是整个行迁移新的数据块还是存不下,那么只能既链接又迁移。
翻译rdba
0x044000f5 = 0000 010001 0000000000000011110101 = 17,245
@dpblk
tl: 6949 fb: -----L-- lb: 0x1  cc: 7 --注意标志位,剩下的7列在该新块中。

到此基本上也就可以确定在LMT--ASSM模式下,pctfree参数是失效的,从上面的例子我们也能看出来ASMM也是存在缺陷的,也会导致行链接和行迁移。
那么ASSM和MSSM哪个更优? 个人认为ASSM更好,因为位图管理增强了并发操作,而MSSM使用free list管理空闲块导致热的链表操作,虽然可以设置
free list group 还是不如bitmap 效率高,对于行迁移和行链接两种管理方式都是无法避免的,需要依据实际情况分析处理,比如我上面构造的极端
情况你就是使用MSSM也是没有办法解决的,除非改变块的大小。

我们引用oracle 12C 官方文档的话:

In ASSM, PCTFREE determines whether a new row can be inserted into a block, but it does not use free
lists and ignores PCTUSED.

从实验结果看该句话是有问题的!!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表