解决行迁移

发生在UPDATE,原块中容纳不下了,那么就得把修改内容放在别的块中,原块中只放了行头和指针,数据跑到别的块中去了

SQL> @?/rdbms/admin/utlchain.sql

SQL> create tablespace test_tbs DATAFILE '/u01/app/oracle/oradata/shujukuai/test_tbs.dbf' size 1m reuse;

Tablespace created.

SQL> select tablespace_name||'|'||SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name='TEST_TBS';

TABLESPACE_NAME||'|'||SEGMENT_SPACE_M
-------------------------------------
TEST_TBS|AUTO

SQL> create table CHAINED_TEST (id int,vc varchar2(4000)) tablespace test_tbs;

Table created.

SQL> insert into CHAINED_TEST values (1,'a');

1 row created.

SQL> insert into CHAINED_TEST values (2,'b');

1 row created.

SQL> insert into CHAINED_TEST values (3,'c');

1 row created.

SQL> insert into CHAINED_TEST values (4,'d');

1 row created.

SQL> commit;

Commit complete.

SQL> set serveroutput on
SQL> exec show_space('CHAINED_TEST',user,'TABLE');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               5
Full Blocks ............................               0
Total Blocks............................               8
Total Bytes.............................          65,536
Total MBytes............................               0
Unused Blocks...........................               0
Unused Bytes............................               0
Last Used Ext FileId....................              11
Last Used Ext BlockId...................               9
Last Used Block.........................               8

PL/SQL procedure successfully completed.

SQL> set autotrace on stat
SQL> update CHAINED_TEST set vc=rpad('1',3999,'*') where id = 1;

1 row updated.


Statistics
----------------------------------------------------------
         48  recursive calls
          4  db block gets
         28  consistent gets
          0  physical reads
       4512  redo size
       2083  bytes sent via SQL*Net to client
       1506  bytes received via SQL*Net from client
          6  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> update CHAINED_TEST set vc=rpad('2',3999,'*') where id = 2;

1 row updated.


Statistics
----------------------------------------------------------
          5  recursive calls
          2  db block gets
         18  consistent gets
          0  physical reads
       4364  redo size
       1139  bytes sent via SQL*Net to client
       1211  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> commit;

Commit complete.

SQL> exec show_space('CHAINED_TEST',user,'TABLE');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               4
Full Blocks ............................               1
Total Blocks............................               8
Total Bytes.............................          65,536
Total MBytes............................               0
Unused Blocks...........................               0
Unused Bytes............................               0
Last Used Ext FileId....................              11
Last Used Ext BlockId...................               9
Last Used Block.........................               8

PL/SQL procedure successfully completed.

分析表

SQL> analyze  table CHAINED_TEST list chained rows ;

Table analyzed.

SQL> set autot off
SQL> select * from CHAINED_ROWS;

no rows selected                                                  没有发生行迁移的行

SQL> set autotrace on stat
SQL> update CHAINED_TEST set vc=rpad('3',3999,'*') where id = 3;

1 row updated.


Statistics
----------------------------------------------------------
          5  recursive calls
          9  db block gets
         27  consistent gets
          0  physical reads
       5092  redo size
       2082  bytes sent via SQL*Net to client
       1506  bytes received via SQL*Net from client
          6  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL> analyze  table CHAINED_TEST list chained rows ;

Table analyzed.

SQL> set autot off
SQL> set linesize 180
SQL> col owner_name for a10
SQL> col table_name for a10
SQL> col cluster_name for a10
SQL> col partition_name for a10
SQL> col subpartition_name for a10
SQL> select * from CHAINED_ROWS;

OWNER_NAME TABLE_NAME CLUSTER_NA PARTITION_ SUBPARTITI HEAD_ROWID         ANALYZE_T
---------- ---------- ---------- ---------- ---------- ------------------ ---------
SYS        CHAINED_TEST                       N/A        AAAMpoAALAAAAAMAAC 05-JUN-10
         

SQL> select distinct dbms_rowid.rowid_block_number(rowid) from CHAINED_TEST;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                  12

SQL> select file_id from dba_data_files where tablespace_name='TEST_TBS';

   FILE_ID
----------
        11

SQL> oradebug setmypid
Statement processed.
SQL> alter system dump datafile 11 block 12;

System altered.

SQL> oradebug tracefile_name
/u01/app/oracle/admin/shujukuai/udump/shujukuai_ora_13072.trc


SQL> host vi /u01/app/oracle/admin/shujukuai/udump/shujukuai_ora_13072.trc
/u01/app/oracle/admin/shujukuai/udump/shujukuai_ora_13072.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1
System name:    Linux
Node name:      RHEL5.4
Release:        2.6.18-164.el5
Version:        #1 SMP Tue Aug 18 15:51:48 EDT 2009
Machine:        x86_64
Instance name: shujukuai
Redo thread mounted by this instance: 1
Oracle process number: 19
Unix process pid: 13072, image: oracle@RHEL5.4 (TNS V1-V3)

*** 2010-06-05 23:54:32.067
*** ACTION NAME:() 2010-06-05 23:54:32.066
*** MODULE NAME:(sqlplus@RHEL5.4 (TNS V1-V3)) 2010-06-05 23:54:32.066
*** SERVICE NAME:(SYS$USERS) 2010-06-05 23:54:32.066
*** SESSION ID:(131.2480) 2010-06-05 23:54:32.066
Start dump data blocks tsn: 12 file#: 11 minblk 12 maxblk 12
buffer tsn: 12 rdba: 0x02c0000c (11/12)
scn: 0x0000.000c9082 seq: 0x01 flg: 0x06 tail: 0x90820601
frmt: 0x02 chkval: 0x5d67 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00000000115FB600 to 0x00000000115FD600
0115FB600 0000A206 02C0000C 000C9082 06010000  [................]
0115FB610 00005D67 00000001 0000CA68 000C904A  [g]......h...J...]
0115FB620 00000000 00320002 02C00009 00050005  [......2.........]
0115FB630 00000157 008030EC 000E00F9 00002001  [W....0....... ..]
0115FB640 000C9082 00200008 0000015E 00803276  [...... .^...v2..]
0115FB650 0019012E 00008000 000C8FE9 00000000  [................]
0115FB660 00000000 00040100 001AFFFF 001C001F  [................]
0115FB670 0000001C 0FD00004 001F0028 00001F78  [........(...x...]
0115FB680 20000000 C0020001 00001000 0202002C  [... ........,...]
0115FB690 9FFE03C1 2A2A320F 2A2A2A2A 2A2A2A2A  [.....2**********]
0115FB6A0 2A2A2A2A 2A2A2A2A 2A2A2A2A 2A2A2A2A  [****************]
        Repeat 248 times
0115FC630 2A2A2A2A 0202002C 9FFE02C1 2A2A310F  [****,........1**]
0115FC640 2A2A2A2A 2A2A2A2A 2A2A2A2A 2A2A2A2A  [****************]
        Repeat 248 times
0115FD5D0 2A2A2A2A 2A2A2A2A 2A2A2A2A 0202002C  [************,...]
0115FD5E0 640105C1 0202012C 630104C1 0202002C  [...d,......c,...]
0115FD5F0 620103C1 0202002C 610102C1 90820601  [...b,......a....]
Block header dump:  0x02c0000c
 Object id on Block? Y
 seg/obj: 0xca68  csc: 0x00.c904a  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2c00009 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.005.00000157  0x008030ec.00f9.0e  --U-    1  fsc 0x0000.000c9082
0x02   0x0008.020.0000015e  0x00803276.012e.19  C---    0  scn 0x0000.000c8fe9

data_block_dump,data header at 0x115fb664
===============
tsiz: 0x1f98
hsiz: 0x1a
pbl: 0x115fb664
bdba: 0x02c0000c
     76543210
flag=--------
ntab=1
nrow=4
frre=-1
fsbo=0x1a
fseo=0x1f
avsp=0x1c
tosp=0x1c
0xe:pti[0]      nrow=4  ffs=0
0x12:pri[0]     ffs=0xfd0
0x14:pri[1]     ffs=0x28
0x16:pri[2]     ffs=0x1f
0x18:pri[3]     ffs=0x1f78
block_row_dump:
tab 0, row 0, @0xfd0
tl: 4008 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  1: [3999]
 31 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a
 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a
 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a
 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a
 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a
。。。。。

tab 0, row 2, @0x1f
tl: 9 fb: --H----- lb: 0x1  cc: 0                       这里只有一个H头了
nrid:  0x02c00010.0                                   指向了迁移的地址
tab 0, row 3, @0x1f78
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 05
col  1: [ 1]  64
end_of_block_dump
End dump data blocks tsn: 12 file#: 11 minblk 12 maxblk 12

SQL> set autot on
SQL> exec show_space('CHAINED_TEST',user,'TABLE');

PL/SQL procedure successfully completed.

SQL> set serveroutput on
SQL> exec show_space('CHAINED_TEST',user,'TABLE');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               1
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               3
Full Blocks ............................               1
Total Blocks............................               8
Total Bytes.............................          65,536
Total MBytes............................               0
Unused Blocks...........................               0
Unused Bytes............................               0
Last Used Ext FileId....................              11
Last Used Ext BlockId...................               9
Last Used Block.........................               8

PL/SQL procedure successfully completed.

SQL> alter table CHAINED_TEST move ;

Table altered.

SQL> exec show_space('CHAINED_TEST',user,'TABLE');
Unformatted Blocks .....................               0
FS1 Blocks (0-25) ......................               0
FS2 Blocks (25-50) .....................               0
FS3 Blocks (50-75) .....................               0
FS4 Blocks (75-100).....................               0
Full Blocks ............................               3
Total Blocks............................               8
Total Bytes.............................          65,536
Total MBytes............................               0
Unused Blocks...........................               2
Unused Bytes............................          16,384
Last Used Ext FileId....................              11
Last Used Ext BlockId...................              17
Last Used Block.........................               6

PL/SQL procedure successfully completed.

SQL> select rowid from Chained_Test where id = 3;             都降低了高水位,行迁移还存在的

ROWID
------------------
AAAMppAALAAAAAWAAA

创建中间表,保留迁移的数据

SQL> CREATE TABLE Int_Chained_Test
    AS SELECT *
       FROM Chained_Test
       WHERE ROWID IN
          (SELECT HEAD_ROWID
             FROM CHAINED_ROWS
                WHERE TABLE_NAME = 'CHAINED_TEST');

Table created.

删除迁移行

SQL>DELETE FROM Chained_Test
   WHERE ROWID IN
      (SELECT HEAD_ROWID
         FROM CHAINED_ROWS
             WHERE TABLE_NAME = 'CHAINED_TEST');

0 rows deleted.

将迁移出的行插入
SQL>INSERT INTO CHAINED_TEST   SELECT *    FROM Int_Chained_Test;

no rows selected

为什么呢,没行数据

SQL> select rowid from Chained_Test where id = 3;

ROWID
------------------
AAAMppAALAAAAAWAAA

SQL> select * from CHAINED_ROWS;

OWNER_NAME TABLE_NAME      CLUSTER_NA PARTITION_ SUBPARTITI HEAD_ROWID         ANALYZE_T
---------- --------------- ---------- ---------- ---------- ------------------ ---------
SYS        CHAINED_TEST                          N/A        AAAMpoAALAAAAAMAAC 05-JUN-10

晕,这两个ROWID没对应上。怀疑是MOVE表的时候变更了

SQL> commit;

Commit complete.

SQL> truncate table Chained_Rows;

Table truncated.

SQL> analyze  table Chained_Test list chained rows ;

Table analyzed.

SQL> select * from Chained_Rows;

no rows selected

SQL> select rowid from Chained_Test where id = 3;

ROWID
------------------
AAAMppAALAAAAAWAAA

SQL> set autot traceonly statistics

SQL> select * from Chained_Test where rowid ='AAAMppAALAAAAAWAAA';


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          1  consistent gets                                        只有一次一致性读了。说明没有发生行迁移了撒
          0  physical reads
          0  redo size
       4586  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> DROP TABLE Int_Chained_Test;

Table dropped.

SQL> DELETE FROM CHAINED_ROWS   WHERE TABLE_NAME = 'CHAINED_TEST';

0 rows deleted.

这个实验说明了一个问题,10G中,MOVE能解决行迁移的问题。

 

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

转载于:http://blog.itpub.net/21158541/viewspace-668402/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值