段(segment)
概述
爲特定的數據庫對象(如表,索引等)分配的一系列數據存儲區域。
默認段名與數據庫對象名相同。
一個對象 一般只對應 一個段。
一個段segment只能屬於一個表空間,但可以跨多個數據文件。
段分爲數據段,索引段,回滾段,臨時段等類型。
select segment_name,segment_type,tablespace_name,bytesfrom dba_segments;
【查詢系統中所有段】
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES
--------------------------------------------------------------------------------------------------- ------------------------------ ----------
WRH$_LATCH_MISSES_SUMMARY TABLE PARTITION SYSAUX 65536
WRH$_LATCH_MISSES_SUMMARY_PK INDEX PARTITION SYSAUX 65536
WRH$_LATCH_MISSES_SUMMARY_PK INDEX PARTITION SYSAUX 65536
WRH$_DB_CACHE_ADVICE TABLE PARTITION SYSAUX 65536
SQL> select segment_type fromdba_segments group bysegment_type;
【查詢系統中所有段種類】
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
11 rows selected.
Elapsed: 00:00:00.53
SQL> select distinct segment_type from dba_segments;
【查詢系統中所有段種類】
SEGMENT_TYPE
------------------
LOBINDEX
INDEX PARTITION
TABLE PARTITION
NESTED TABLE
ROLLBACK
LOB PARTITION
LOBSEGMENT
INDEX
TABLE
CLUSTER
TYPE2 UNDO
11 rows selected.
段管理方式
MSSM(manual segment space management手動段空間管理)在每個段中以freelist鏈表方式管理段中空閒數據塊(塊中空閒區高於pctfree值),是ora9.2以前的數據塊管理方式。
ASSM(automatic segment space management自動段空間管理,默認)以位圖BMB(bitmap managed segments)方式管理段中的空閒數據塊(塊中空閒區高於pctfree 值)以避免freelist鏈表競爭,是ora9.2開始新出現的數據塊管理方式。
區別:1.注意ASSM與內存管理中ASMM(自動共享內存管理)不同。
2.DMT(dictionary managed tablespace數據字典管理方式) USET 和 FET
/LMT(locally managed tablespace,本地表管理空間) 每個表的數據文件的頭部加入一個二維表(auotoallocate(16,64k;63 ,1M;120,8M;64M)/uniform(1M))
和MSSM/ASSM的聯繫與區別:
兩者都在建立表空間時指定。
DMT/LMT用於管理(segment 中)空閒的extent.
MSSM/ASSM用於管理(extent 中的)空閒的block.
SQL> select tablespace_name,extent_management,allocation_type,segment_space_managementfrom dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN ALLOCATIOSEGMEN
------------------------------ ------------------- ------
SYSTEM LOCAL SYSTEM MANUAL
UNDOTBS1 LOCAL SYSTEM MANUAL
SYSAUX LOCAL SYSTEM AUTO
TEMP LOCAL UNIFORM MANUAL
USERS LOCAL SYSTEM AUTO
EXAMPLE LOCAL SYSTEM AUTO
I LOCAL SYSTEM AUTO
TEST LOCAL SYSTEM AUTO
TEST2 LOCAL SYSTEM AUTO
TEMP1 LOCAL UNIFORM MANUAL
TEST4 LOCAL SYSTEM AUTO
TEST5 LOCAL SYSTEM AUTO
T1 LOCAL SYSTEM AUTO
T2 LOCAL UNIFORM AUTO
CWDATA LOCAL SYSTEM AUTO
CWINDEX LOCAL SYSTEM AUTO
TEMP2 LOCAL UNIFORM MANUAL
TEMP3 LOCAL UNIFORM MANUAL
TEMP4 LOCAL UNIFORM MANUAL
19 rows selected.
【查詢表空間的空閒extent管理方式(DMT/LMT(autoallocate/uniform))和空閒block管理方式(MSSM/ASSM)】
SQL> create tablespace tb1 datafile'/u01/tb1.dbf' size 50M segment space management manual;
【指定表空間的段空間管理方式爲MSSM】
Tablespace created.
SQL> selecttablespace_name,extent_management,allocation_type,segment_space_management fromdba_tablespaces;
TB1 LOCAL SYSTEM MANUAL
數據段
數據段也稱爲表段,它包含數據並且與表和簇相關。當創建一個表時,系統自動創建一個以該表的名字命名的數據段。
數據段是用於存儲數據的段,其存儲在數據表空間中。每一個表都有一個數據段,表的數據存儲在數據段中,默認情況下段名與表名相同。
SQL> create table xiao tablespace t1 asselect * from dba_objects;
create table xiao tablespace t1 as select *from dba_objects
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by128 in tablespace T1
SQL>alter tablespace t1 add datafile '/u01/a.dat' size 50M;
【擴展表空間】
Tablespace altered.
Elapsed: 00:00:07.48
SQL> create table xiao tablespace t1 as select* from dba_objects;
Table created.【在指定表空間中建表】
SQL> selectsegment_name,segment_type,tablespace_name,bytes from dba_segments wheresegment_name='XIAO';
【查詢隨建表而建立的數據段】
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES
--------------------------------------------------------------------------------------------------- ------------------------------ ----------
XIAO TABLE T1 6291456
索引段
索引段用於存儲索引,包含了用於提高系統性能的索引。一旦建立索引,系統自動創建一個以該索引的名字命名的索引段。
SQL> selectsegment_name,segment_type,tablespace_name,bytes from dba_segments wheresegment_name='X' and segment_type='INDEX';
【查詢索引段不存在】
no rows selected
SQL> create index x on xiao (object_id);
【對錶建立索引】
Index created.
SQL> selectsegment_name,segment_type,tablespace_name,bytes from dba_segments where segment_name='X'and segment_type='INDEX';
【再查索引段已存在】
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES
--------------------------------------------------------------------------------------------------- ------------------------------ ----------
X INDEX SYSTEM 983040
SQL> selectindex_name,table_name,tablespace_name from dba_indexes where index_name='X';
【注意與索引本身信息的區別】
INDEX_NAME TABLE_NAME TABLESPACE_NAME
------------------------------------------------------------ ------------------------------
X XIAO SYSTEM
回退段
回退段用於存儲用戶數據修改之前的值,因而可以在特定條件下回退數據。回退段與事務是一對多的關係,一個事務只能使用一個回退段,而一個回退段可存放一個或多個事務的回退數據。當一個事務開始處理時,系統爲之分配回滾段存儲回滾信息,當所有回退段都已被事務佔用時,系統將創建出新的回退段來存儲新事務的回滾信息,當表空間中無空間可用於再分配新的回退段時,多個事務將共用一個回退段。
Oracle9i之後,oracle增加了undo表空間,由系統自動管理。故可不再需要考慮對回退段的管理,在系統自動管理模式下,ORACLE會自動完成回退段的創建、刪除以及ONLINE/OFFLINE,DBA不能干預這些操作。
SQL> select segment_id,segment_name fromdba_rollback_segs;
【查詢Undo表空間中的回退段】
SEGMENT_ID SEGMENT_NAME
---------- ------------------------------
0 SYSTEM 【系統回滾段】
1 _SYSSMU1$
2 _SYSSMU2$
3 _SYSSMU3$
4 _SYSSMU4$
5 _SYSSMU5$
6 _SYSSMU6$
7 _SYSSMU7$
8 _SYSSMU8$
9 _SYSSMU9$
10_SYSSMU10$
11 rows selected.
SQL> selecta.name,b.xacts,b.writes,b.extents,b.rssize from v$rollname a,v$rollstat b wherea.usn=b.usn;
【查每個回退段名稱,每個段當前所包含活動事務數,啓動後每個段上所有活動事務在該段上所佔字節數,每個段的大小(extents的個數),每個段的大小(字節數)。】
NAME XACTS WRITES EXTENTS RSSIZE
------------------------------ -------------------- ---------- ----------
SYSTEM 0 7728 6 385024
_SYSSMU1$ 0 336628 3 1171456
_SYSSMU2$ 0 463522 3 1171456
_SYSSMU3$ 0 185212 3 1171456
_SYSSMU4$ 0 110000 3 1171456
_SYSSMU5$ 0 108264 3 1171456
_SYSSMU6$ 0 89612 3 1171456
_SYSSMU7$ 0 182510 3 1171456
_SYSSMU8$ 0 194032 4 253952
_SYSSMU9$ 0 315174 4 253952
_SYSSMU10$ 0 202786 3 1171456
11 rows selected.
SQL> drop table t1;
Table dropped.
Elapsed: 00:00:04.71
SQL> create table t1 as select * fromdba_objects where 1=2;
Table created.
Elapsed: 00:00:00.08
SQL> insert into t1 select * fromdba_objects;
50793 rows created.
SQL> select a.name,b.xacts,b.writes,b.extentsfrom v$rollname a,v$rollstat b where a.usn=b.usn;
NAME XACTS WRITES EXTENTS
------------------------------ -------------------- ----------
SYSTEM 0 7728 6
_SYSSMU1$ 0 343316 3
_SYSSMU2$ 0 480452 3
_SYSSMU3$ 0 197400 3
_SYSSMU4$ 0 118040 3
_SYSSMU5$ 1 309656 3
_SYSSMU6$ 0 98656 3
_SYSSMU7$ 0 189976 3
_SYSSMU8$ 0 211206 4
_SYSSMU9$ 0 12295186 27
_SYSSMU10$ 0 234340 3
11 rows selected.
SQL> delete from t1;
50793 rows deleted.
Elapsed: 00:00:15.26
SQL> selecta.name,b.xacts,b.writes,b.extents from v$rollname a,v$rollstat b wherea.usn=b.usn;
NAME XACTS WRITES EXTENTS
------------------------------ -------------------- ----------
SYSTEM 0 7728 6
_SYSSMU1$ 0 343316 3
_SYSSMU2$ 0 480452 3
_SYSSMU3$ 0 197400 3
_SYSSMU4$ 0 118040 3
_SYSSMU5$ 1 12086214 14
_SYSSMU6$ 0 98932 3
_SYSSMU7$ 0 190402 3
_SYSSMU8$ 0 211360 4
_SYSSMU9$ 0 12295186 27
_SYSSMU10$ 0 234340 3
11 rows selected.
SQL> select segment_name,extent_id,bytes,status from dba_undo_extents;
SEGMENT_NAME EXTENT_ID BYTES STATUS
------------------------------ -------------------- ---------
_SYSSMU1$ 0 65536 EXPIRED
_SYSSMU1$ 1 65536 UNEXPIRED
_SYSSMU1$ 2 1048576 UNEXPIRED
_SYSSMU2$ 0 65536 EXPIRED
_SYSSMU2$ 1 65536 EXPIRED
_SYSSMU2$ 2 1048576 EXPIRED
_SYSSMU3$ 0 65536 EXPIRED
_SYSSMU3$ 1 65536 EXPIRED
_SYSSMU3$ 2 1048576 EXPIRED
_SYSSMU4$ 0 65536 EXPIRED
_SYSSMU4$ 1 65536 EXPIRED
_SYSSMU4$ 2 1048576 EXPIRED
_SYSSMU5$ 0 65536 ACTIVE
_SYSSMU5$ 1 65536 ACTIVE
_SYSSMU5$ 2 1048576 ACTIVE
_SYSSMU5$ 3 1048576 ACTIVE
_SYSSMU5$ 4 1048576 ACTIVE
_SYSSMU5$ 5 1048576 ACTIVE
_SYSSMU5$ 6 1048576 ACTIVE
_SYSSMU5$ 7 1048576 ACTIVE
_SYSSMU5$ 8 1048576 ACTIVE
_SYSSMU5$ 9 1048576 ACTIVE
SEGMENT_NAME EXTENT_ID BYTES STATUS
------------------------------ -------------------- ---------
_SYSSMU5$ 10 1048576 ACTIVE
_SYSSMU5$ 11 1048576 ACTIVE
_SYSSMU5$ 12 1048576 ACTIVE
_SYSSMU5$ 13 1048576 ACTIVE
_SYSSMU6$ 0 65536 EXPIRED
_SYSSMU6$ 1 65536 EXPIRED
_SYSSMU6$ 2 1048576 EXPIRED
_SYSSMU7$ 0 65536 EXPIRED
_SYSSMU7$ 1 65536 EXPIRED
_SYSSMU7$ 2 1048576 EXPIRED
_SYSSMU8$ 0 65536 EXPIRED
_SYSSMU8$ 1 65536 EXPIRED
_SYSSMU8$ 2 65536 EXPIRED
_SYSSMU8$ 3 65536 EXPIRED
_SYSSMU9$ 0 65536 UNEXPIRED
_SYSSMU9$ 1 65536 UNEXPIRED
_SYSSMU9$ 2 65536 UNEXPIRED
_SYSSMU9$ 3 65536 UNEXPIRED
_SYSSMU9$ 4 65536 UNEXPIRED
_SYSSMU9$ 5 65536 UNEXPIRED
_SYSSMU9$ 6 65536 UNEXPIRED
_SYSSMU9$ 7 65536 UNEXPIRED
SEGMENT_NAME EXTENT_ID BYTES STATUS
------------------------------ -------------------- ---------
_SYSSMU9$ 8 65536 UNEXPIRED
_SYSSMU9$ 9 65536 UNEXPIRED
_SYSSMU9$ 10 65536 UNEXPIRED
_SYSSMU9$ 11 65536 UNEXPIRED
_SYSSMU9$ 12 65536 UNEXPIRED
_SYSSMU9$ 13 65536 UNEXPIRED
_SYSSMU9$ 14 65536 UNEXPIRED
_SYSSMU9$ 15 1048576 UNEXPIRED
_SYSSMU9$ 16 1048576 UNEXPIRED
_SYSSMU9$ 17 1048576 UNEXPIRED
_SYSSMU9$ 18 1048576 UNEXPIRED
_SYSSMU9$ 19 1048576 UNEXPIRED
_SYSSMU9$ 20 1048576 UNEXPIRED
_SYSSMU9$ 21 1048576 UNEXPIRED
_SYSSMU9$ 22 1048576 UNEXPIRED
_SYSSMU9$ 23 1048576 UNEXPIRED
_SYSSMU9$ 24 1048576 UNEXPIRED
_SYSSMU9$ 25 1048576 UNEXPIRED
_SYSSMU9$ 26 65536 UNEXPIRED
_SYSSMU10$ 0 65536 EXPIRED
_SYSSMU10$ 1 65536 EXPIRED
_SYSSMU10$ 2 1048576 EXPIRED
【查回退段的extent分配詳情及狀態】
Active:有活動事務在此extent上
Unexpired(未過期的,爲盡的):已結束事務,undo信息未達到undo_retention(保留,扣留,記憶)時間限制
Expired(過期的,失效的):已結束事務,undo信息超過undo_retention時間限制。
SQL> create table xiaoxue.t1 as select *from dba_objects;
Table created.
SQL> alter database datafile'/u01/a.dat' autoextend on maxsize 100M;
Database altered.
SQL>alter tablespace CWdata add datafile '/u01/e.dat' size 50M;
Tablespacealtered.
[oracle@desktop241 ~]$ sqlplusxiaoxue/123456
SQL> insert into t1 select * from t1;
50794 rows created.
Elapsed: 00:00:07.71
SQL> insert into t1 select * from t1;
101588 rows created.
Elapsed: 00:00:07.08
SQL> insert into t1 select * from t1;
203176 rows created.
SQL> selecta.username,b.name,c.used_ublk from v$session a,v$rollname b,v$transaction cwhere a.saddr=c.ses_addr and b.usn=c.xidusn;
【查DB中所有活動(未提交或回退)事務所佔用的回退段情況,sys】
USERNAME NAME USED_UBLK
------------------------------------------------------------ ----------
XIAOXUE _SYSSMU9$ 166
SQL> selecta.name,b.xacts,b.writes,b.extents from v$rollname a,v$rollstat b wherea.usn=b.usn;[]
NAME XACTS WRITES EXTENTS
------------------------------ -------------------- ----------
SYSTEM 0 7728 6
_SYSSMU1$ 0 447038 3
_SYSSMU2$ 0 519708 3
_SYSSMU3$ 0 274628 3
_SYSSMU4$ 0 236260 3
_SYSSMU5$ 0 12095186 14
_SYSSMU6$ 0 171158 3
_SYSSMU7$ 0 213268 3
_SYSSMU8$ 0 233848 4
_SYSSMU9$ 1 13797338 6
_SYSSMU10$ 0 357506 3
11 rows selected.
SQL> rollback;
Rollback complete.
SQL> selecta.name,b.xacts,b.writes,b.extents from v$rollname a,v$rollstat b wherea.usn=b.usn;
NAME XACTS WRITES EXTENTS
------------------------------ -------------------- ----------
SYSTEM 0 7728 6
_SYSSMU1$ 0 447410 3
_SYSSMU2$ 0 519862 3
_SYSSMU3$ 0 275584 3
_SYSSMU4$ 0 236590 3
_SYSSMU5$ 0 12095962 14
_SYSSMU6$ 0 172834 3
_SYSSMU7$ 0 213804 3
_SYSSMU8$ 0 235596 4
_SYSSMU9$ 0 13797338 6
_SYSSMU10$ 0 357782 3
11 rows selected.
【回退上頁事務後再查回退段的使用情況】
SQL> selectsegment_name,extent_id,bytes,status from dba_undo_extents;
SEGMENT_NAME EXTENT_ID BYTES STATUS
------------------------------ -------------------- ---------
_SYSSMU1$ 0 65536 EXPIRED
_SYSSMU1$ 1 65536 EXPIRED
_SYSSMU1$ 2 1048576 EXPIRED
_SYSSMU2$ 0 65536 EXPIRED
事務可以使用回滾段的同一個區,但每個回滾段的塊只能包含一個事務的信息。
例如(兩個事務使用同一個回滾段,該回滾段由四個區):
1. 事務在進行中,他們正在使用回滾段的第三個區;
2. 當第三個區滿後,事務將寫到第四個區,當事務開始寫到一新區時,稱翻轉WRAP;
3. 當第四個區用滿時,若第一個區是空閒或非活動的,即該區中所有事務均已完成,沒有未提交或回退事務,則事務將循環再使用第一個區。
回滾段的擴張(EXTEND)
在當前區的所有塊用完而事務還需要更多還需要更多的回滾空間時,將使用回滾的下一個區,當 最後一個區用完,將循環重新使用第一個區。
回滾段使用下一個區的前提是下一個區沒有活動事務,若下一個區正在使用即存在活動事務時,則需進行回滾段擴張,事務將:
1. 從undo表空間中爲回滾段分配一個新的空閒區,或從其他回滾段中獲取一個expire狀態的區,插入到當前區和下一個區之間。
2. 若Undo空間已無新空閒區,或其他回滾段中也無exipre狀態區,則嘗試擴張undo空間;
3. 若表空間autoextensiable自動擴張屬性被禁止,則嘗試從其他回滾段中獲取unexipre狀態(未超過retention 期限)的區(因此可能導致之後發生01555錯))
4. 若上面所有擴張方法均失敗,則報錯空間不足。
爲確保其他回滾段中unexpired狀態的區不被用掉,避免01555錯誤,可設置參數guarantee,則extent將一定保留到超過retention時間,則回滾段擴展時將跳過第3步。
SQL> alter tablespace undotbs1 retention guarantee;
Tablespace altered.
SQL> select segment_name,owner,status from dba_rollback_segs;
【查詢數據庫自動管理回退信息時在undo表空間中使用的回退段】
SEGMENT_NAME OWNER STATUS
------------------------------ ------ ----------------
SYSTEM SYS ONLINE
_SYSSMU1$ PUBLIC ONLINE
_SYSSMU2$ PUBLIC ONLINE
_SYSSMU3$ PUBLIC ONLINE
_SYSSMU4$ PUBLIC ONLINE
_SYSSMU5$ PUBLIC ONLINE
_SYSSMU6$ PUBLIC ONLINE
_SYSSMU7$ PUBLIC ONLINE
_SYSSMU8$ PUBLIC ONLINE
_SYSSMU9$ PUBLIC ONLINE
_SYSSMU10$ PUBLIC ONLINE
11 rows selected.
SQL> create table a as select * from dba_objects;
Table created.
Elapsed: 00:00:03.06
SQL> create table b as select * from dba_objects;
Table created.
SQL> delete from a;
50794 rows deleted.
Elapsed: 00:00:19.61
SQL> select distinct sid from v$mystat;
【建兩個測試表,發起一個delete操作耗費回滾段空間,並查找出任務號】
SID
----------
158
[oracle@desktop241 ~]$ sqlplus / as sysdba
【另開一個會話併發起另一個update操作耗費回滾段空間,並查找出任務號】
SQL> update b set object_id=0;
50795 rows updated.
Elapsed: 00:00:30.18
SQL> select distinct sid from v$mystat;
SID
----------
139
【會話號】
SQL> select r.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.used_ublk,t.noundo,substr(s.program,1,40)from sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r where t.addr =s.taddr and t.xidusn = r.usn and s.sid = 158;
NAME SERIAL# SID USERNAME STATUS CR_GET PHY_IO USED_UBLK NOU SUBSTR(S.PROGRAM,1,40)
------------------------------ ---------- ---------------------------------------- ---------------- ---------- ---------- ---------------------------------------------------------------------------------------------
_SYSSMU8$ 7 158 SYS ACTIVE 879 448 1466 NO [email protected] (TNS V1-V
Elapsed: 00:00:00.09
SQL> select r.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.used_ublk,t.noundo,substr(s.program,1,40)from sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r where t.addr =s.taddr and t.xidusn = r.usn and s.sid = 139;
NAME SERIAL# SID USERNAME STATUS CR_GET PHY_IO USED_UBLK NOU SUBSTR(S.PROGRAM,1,40)
------------------------------ ---------- ---------------------------------------- ---------------- ---------- -------------------- -----------------------------------------------------------------------------------
_SYSSMU10$ 76 139 SYS ACTIVE 1544 390 1030 NO [email protected] (TNS V1-V
SQL> selectr.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.used_ublk,t.noundo,substr(s.program,1,40)from sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r where t.addr =s.taddr and t.xidusn = r.usn and s.sid = &sid;
Enter value for sid: 139
回滾表空間的回縮(SHRINK)
Undo表空間被系統自動重複使用,當有大事務發生時,系統將自動擴充undo表空間,但不會自動進行回縮,故需手工回縮undo表空間。
SQL> create undo tablespace undotbs02 datafile'/u01/app/oracle/oradata/ora10/undotbs02.dbf' size 50M;
【新建回滾表空間】
Tablespace created.
Elapsed: 00:00:05.12
SQL> alter system set undo_tablespace=undotbs02;
【設置新的回滾表空間】
System altered.
Elapsed: 00:00:00.27
SQL> show parameter undo_tablespace;
【查詢當前使用的undo表空間名】
NAME TYPE VALUE
------------------------------------ -----------------------------------------
undo_tablespace string UNDOTBS02
SQL> select segment_name,owner,status from dba_rollback_segs;
【查詢數據庫自動管理回退信息時在undo表空間中使用的回退段。可見原測試所佔回退段仍online,提交或回退測試語句不久後將offline,才能刪除原undo空間,若原undo空間中還含有unexpire區,則可能導致之後發生01555錯,故應等待retention時間長度後再刪原undo空間】
SEGMENT_NAME OWNER STATUS
------------------------------ ------ ----------------
SYSTEM SYS ONLINE
_SYSSMU1$ PUBLIC OFFLINE
_SYSSMU2$ PUBLIC OFFLINE
_SYSSMU3$ PUBLIC OFFLINE
_SYSSMU4$ PUBLIC OFFLINE
_SYSSMU5$ PUBLIC OFFLINE
_SYSSMU6$ PUBLIC OFFLINE
_SYSSMU7$ PUBLIC OFFLINE
_SYSSMU8$ PUBLIC OFFLINE
_SYSSMU9$ PUBLIC OFFLINE
_SYSSMU10$ PUBLIC ONLINE
_SYSSMU11$ PUBLIC ONLINE
_SYSSMU12$ PUBLIC ONLINE
_SYSSMU13$ PUBLIC ONLINE
_SYSSMU14$ PUBLIC ONLINE
_SYSSMU15$ PUBLIC ONLINE
_SYSSMU16$ PUBLIC ONLINE
_SYSSMU17$ PUBLIC ONLINE
_SYSSMU18$ PUBLIC ONLINE
_SYSSMU19$ PUBLIC ONLINE
_SYSSMU20$ PUBLIC ONLINE
21 rows selected.
臨時段
當一個SQL語句需要臨時工作區時,由oracle將臨時表空間創建爲臨時段。一旦語句執行完畢,臨時表空間即臨時段的空間便退回給系統。
臨時段用於order by 語句的排序以及一些彙總。
SQL> alter database default temporarytablespace temp;
Database altered.
Elapsed: 00:00:00.23
SQL> selectsegment_file,total_extents,total_blocks,used_extents,used_blocks,free_extentsfrom v$sort_segment;
【查臨時表空間(臨時段的總區、塊數,已用區、塊數及空閒區、塊數】
SEGMENT_FILE TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTS USED_BLOCKS FREE_EXTENTS
------------ ------------- ------------------------ ----------- ------------
0 0 0 0 0 0
SQL> selectusername,segfile#,extents,blocks from v$sort_usage;
【查當前使用臨時表空間(臨時段)中的用戶,及所佔區、塊數】
no rows selected
SQL> conn xiaoxue/123456
SQL> select a.table_name,b.table_namefrom dict a,dict b order by a.table_name;
SQL> conn scott/tiger
SQL> select a.table_name,b.table_namefrom dict a,dict b order by b.table_name;
SQL> alter database default temporarytablespace temp2;
Database altered.
Elapsed: 00:00:00.13
SQL> selectusername,segfile#,extents,blocks from v$sort_usage;
USERNAME SEGFILE# EXTENTS BLOCKS
------------------------------ -------------------- ----------
SCOTT 202 20 2560
XIAOXUE 202 21 2688
Elapsed: 00:00:00.16
SQL> selectsegment_file,total_extents,total_blocks,used_extents,used_blocks,free_extentsfrom v$sort_segment;
SEGMENT_FILE TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTSUSED_BLOCKS FREE_EXTENTS
------------ ------------- ------------------------ ----------- ------------
0 0 0 0 0 0
0 41 5248 41 5248 0
0 0 0 0 0 0
SQL> select segment_file,total_extents,total_blocks,used_extents,used_blocks,free_extents,free_blocksfrom v$sort_segment;
SEGMENT_FILE TOTAL_EXTENTS TOTAL_BLOCKSUSED_EXTENTS USED_BLOCKS FREE_EXTENTS FREE_BLOCKS
------------ ------------- ------------------------ ----------- ------------ -----------
0 0 0 0 0 0 0
0 41 5248 41 5248 0 0
0 0 0 0 0 0 0
SQL> create temporary tablespacetempp tempfile '/u01/temp01.dat' size10M;
Tablespace created.
Elapsed: 00:00:02.56
SQL> alter database default temporarytablespace tempp;
Database altered.
$Sqlplus / as sysdba
SQL> create temporary tablespacetempp tempfile '/u01/temp01.dat' size10M;
Tablespace created.
Elapsed: 00:00:02.56
SQL> alter database default temporarytablespace tempp;
Database altered.
Elapsed: 00:00:00.07
SQL> alter database tempfile'/u01/temp01.dat' autoextend on;
Database altered.
SQL> select a.table_name,b.table_namefrom dict a,dict b order by a.table_name;
SQL> conn / as sysdba
Connected.
SQL> selecttotal_extents,total_blocks,used_extents,used_blocks,free_extents,free_blocksfrom v$sort_segment;
TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTSUSED_BLOCKS FREE_EXTENTS FREE_BLOCKS
------------- ------------ ----------------------- ------------ -----------
0 0 0 0 0 0
41 5248 0 0 41 5248
0 0 0 0 0 0
9 1152 0 0 9 1152
SQL> select total_extents,total_blocks,used_extents,used_blocks,free_extents,free_blocksfrom v$sort_segment;
TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTSUSED_BLOCKS FREE_EXTENTS FREE_BLOCKS
------------- ------------ ----------------------- ------------ -----------
0 0 0 0 0 0
41 5248 0 0 41 5248
0 0 0 0 0 0
63 8064 63 8064 0 0
SQL> selecttotal_extents,total_blocks,used_extents,used_blocks,free_extents,free_blocksfrom v$sort_segment;
TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTSUSED_BLOCKS FREE_EXTENTS FREE_BLOCKS
------------- ------------ ----------------------- ------------ -----------
0 0 0 0 0 0
41 5248 0 0 41 5248
0 0 0 0 0 0
71 9088 71 9088 0 0
SQL> selecttotal_extents,total_blocks,used_extents,used_blocks,free_extents,free_blocksfrom v$sort_segment;
TOTAL_EXTENTS TOTAL_BLOCKS USED_EXTENTSUSED_BLOCKS FREE_EXTENTS FREE_BLOCKS
------------- ------------ ----------------------- ------------ -----------
0 0 0 0 0 0
41 5248 0 0 41 5248
0 0 0 0 0 0
159 20352 159 20352 0 0
區(extent)
概述
又稱範圍,是一組表空間內連續分配的相鄰數據塊。
是數據庫分配磁盤空間的最小邏輯單位,也是表中數據增長的基本單位。
一個oracle對象包含至少一個數據區。
區的storage分配參數:
Initial: 段建立時被分配的第一個區(第一塊空間)的大小;
Next: 段被分配的第二個區的大小;
Minextents: 段被分配的區個數下限;
Maxextents:段被分配的區個數上限;
Pctincrease:從第3個分區開始,段被分配的新區比以前一個分配的分區擴大的百分比;
Autoallocate管理方式下,表空間的extent分配原則是:initial,min,max自動取默認值(分別爲64k,1,2^31),next,pct參數無效;表空間中建表時,extent分配情況按表空間所定參數進行,並以下列規則進行extent擴充,而建表時指定上述各項storage參數無效。
Next,pct 參數無效,所有空間分配按64K的整數倍大小進行分配;
第0—15 個分區,每個分區大小64k,合計1M;
第16—79個分區,每個分區大小1M,合計63M;
以上兩項大小合計64M;
第80—199個分區,每個分區大小8M,合計960M,
以上三項大小合計1024M;
第200個分區以上,每個分區大小是64M。
Oracle10.2.0.2分區分配規則:
第0—127個分區,每個分區大小8M,合計1G;
第128個分區以上,每個分區64M。
SQL> create tablespace tb2 datafile'tb2.dbf' size 50M;
【建表空間默認使用autoallocate管理方式】
Tablespace created.
Elapsed: 00:00:03.94
SQL> selectsubstr(tablespace_name,1,8),initial_extent,next_extent,min_extents,max_extents,pct_increasefrom dba_tablespaces;
【查看錶空間分區情況】
SUBSTR(TABLESPAC INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTSPCT_INCREASE
---------------- -------------- ---------------------- ----------- ------------
SYSTEM 65536 1 2147483645
UNDOTBS1 65536 1 2147483645
SYSAUX 65536 1 2147483645
TEMP 1048576 1048576 1 0
USERS 65536 1 2147483645
EXAMPLE 65536 1 2147483645
I 65536 1 2147483645
TEST 65536 1 2147483645
TEST2 65536 1 2147483645
TEMP1 1048576 1048576 1 0
TEST4 65536 1 2147483645
TEST5 65536 1 2147483645
T1 65536 1 2147483645
T2 2097152 2097152 1 2147483645 0
CWDATA 65536 1 2147483645
CWINDEX 65536 1 2147483645
TEMP2 1048576 1048576 1 0
TEMP3 1048576 1048576 1 0
TEMP4 1048576 1048576 1 0
TB1 65536 1 2147483645
UNDOTBS0 65536 1 2147483645
TB2 65536 1 2147483645
22 rows selected.
SQL> create table t2 tablespace tb2storage(initial 50k next 80k minextents 3 maxextents 9 pctincrease 40) asselect * from dba_objects where 1=2;
【建表時指定分區參數】
Table created.
SQL> selectsubstr(table_name,1,8),initial_extent,next_extent,min_extents,max_extents,pct_increasefrom dba_tables where table_name='T2';
【查表分區參數,可見所有指定參數均失效】
SUBSTR(TABLE_NAM INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTSMAX_EXTENTS PCT_INCREASE
---------------- -------------- ---------------------- ----------- ------------
T2 253952 81920 1 2147483645
【50+80+80*(40%+1)=242k】
SQL> selectextent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents wheresegment_name='T2';
【查詢指定表的實際分區情況,可見首個分區分配爲64K】
EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES
---------- ---------------- ----------------------------------------
0 T2 TB2 65536
1 T2 TB2 65536
2 T2 TB2 65536
3 T2 TB2 65536
SQL> insert into t2 select * fromdba_objects;
【擴充表後再用上一條命令查表的實際分區情況,可見擴充分區分配滿足上頁規則】
50795 rows created.
SQL> selectextent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents wheresegment_name='T2';
EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES
---------- ---------------------------------------------- ----------
0 T2 TB2 65536
1 T2 TB2 65536
2 T2 TB2 65536
3 T2 TB2 65536
4 T2 TB2 65536
5 T2 TB2 65536
6 T2 TB2 65536
7 T2 TB2 65536
8 T2 TB2 65536
9 T2 TB2 65536
10T2 TB2 65536
11T2 TB2 65536
12T2 TB2 65536
13T2 TB2 65536
14T2 TB2 65536
15T2 TB2 65536
16T2 TB2 1048576
17T2 TB2 1048576
18T2 TB2 1048576
19T2 TB2 1048576
20T2 TB2 1048576
21 rows selected.
Uniform管理方式下,表空間的extent分配原則是:initial,next值固定爲uniform 指定值,min,max,pct參數自動設置默認值(分別爲1,2^31,0);表空間中新建表時,extent分配情況按表空間所定參數進行,並以固定不變的uniform值進行extent擴充,而建表時指定上述各項storage參數無效。
SQL> create tablespace tb1 datafile'tb1.dbf' size 50Muniform size 1500k;
【建表空間指定Uniform分區大小】
Tablespace created.
SQL> select substr(tablespace_name,1,8),initial_extent,next_extent,min_extents,max_extents,pct_increasefrom dba_tablespaces;
【查表空間分區分配情況】
SUBSTR(TABLESPAC INITIAL_EXTENT NEXT_EXTENTMIN_EXTENTS MAX_EXTENTS PCT_INCREASE
---------------- -------------- ---------------------- ----------- ------------
SYSTEM 65536 1 2147483645
UNDOTBS1 65536 1 2147483645
SYSAUX 65536 1 2147483645
TEMP 1048576 1048576 1 0
USERS 65536 1 2147483645
EXAMPLE 65536 1 2147483645
I 65536 1 2147483645
TEST 65536 1 2147483645
TEST2 65536 1 2147483645
TEMP1 1048576 1048576 1 0
TEST4 65536 1 2147483645
TEST5 65536 1 2147483645
T1 65536 1 2147483645
T2 2097152 2097152 1 2147483645 0
CWDATA 65536 1 2147483645
CWINDEX 65536 1 2147483645
TEMP2 1048576 1048576 1 0
TEMP3 1048576 1048576 1 0
TEMP4 1048576 1048576 1 0
TB1 1540096 1540096 1 2147483645 0
UNDOTBS0 65536 1 2147483645
TB2 65536 1 2147483645
22 rows selected.
SQL> create table t1 tablespace tb1storage (initial 50k next 80k minextents 3 maxextents 9 pctincrease 40) asselect * from dba_objects where 1=2;
【建表時指定分區參數】
Table created.
SQL> select substr(table_name,1,8),initial_extent,next_extent,min_extents,max_extents,pct_increasefrom dba_tables where table_name='T1';
【查表分區參數,可見所有指定參數均失效】
SUBSTR(TABLE_NAM INITIAL_EXTENT NEXT_EXTENTMIN_EXTENTS MAX_EXTENTS PCT_INCREASE
---------------- -------------- ---------------------- ----------- ------------
T1 65536 1048576 1 2147483645
T1 253952 81920 1 2147483645 0
SQL> selectextent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents wheresegment_name='T1';
【查詢指定表的實際分區情況,可見首個分區分配爲uniform指定值】
EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES
---------- ---------------------------------------------- ----------
0 T1 TB1 1540096
SQL> insert into t1 select * fromdba_objects;
【擴充表後再用上一條命令查表的實際分區情況,可見擴充分區分配也均爲uniform值】
50795 rows created.
Elapsed: 00:00:01.93
SQL> selectextent_id,substr(segment_name,1,8),tablespace_name,bytes from dba_extents wheresegment_name='T1';
EXTENT_ID SUBSTR(SEGMENT_N TABLESPACE_NAME BYTES
---------- ---------------------------------------------- ----------
0 T1 TB1 1540096
1 T1 TB1 1540096
2 T1 TB1 1540096
3 T1 TB1 1540096
塊(block)
概述
是一個或一組連續的OS塊(512bytes),大小是OS塊的整數倍。
是數據庫中粒度最小的數據組織單位與管理單位
是數據文件磁盤存儲空間單位,也是數據庫I/O的最小單位
數據塊大小由DB_BLOCK_SIZE參數決定,默認8K
9i以前只能設定一種塊大小,9i/10g中不同表空間可指定不同塊大小。
塊結構
塊頭: 塊概要信息,包括塊地址,段類型等
表目錄:在該塊中存儲了數據行的表的表信息
行目錄:存儲在該塊中的數據行的行信息
空閒區:用於插入新行和需要額外空間的行更新
行數據:存儲在該塊中的數據行的具體內容
塊參數(pctfree,pctused)
Pctfree(默認值10)
當向一個空數據塊插入的數據量達到該數據塊大小1-pctfree時,即停止對該塊進行插入(剩餘空間留給update更新使用),而再分配另一新數據塊進行插入,並將該塊從空閒塊列表freelist中移出。
經常進行update的表應將pctfree調高,則更新時可儘量保證更新數據仍位於原數據塊中,避免發生行遷移或行鏈接。因爲update操作會消耗掉空閒空間,當一個塊中的空閒空間因爲太小而不夠update操作消耗的話,系統就會增加新塊,從而形成記錄鏈接或行遷移映響表的I/O功能。
Pctused(默認值40)
當數據塊內數據被刪除到pctused所指定的值時,即將該塊移入空閒列表freelist中,使其可以接受新數據的插入。
經常進行delete的表應將pctused調高,以便能有效利用空間,因爲一個pctused值較高的數據塊,其中能存放的數據將更多,該參數和pctfree配合使用,pctused越大越有利於insert,pctfree越大越有利於update,兩參數加起來不能超過100.
行遷移:一行記錄初始插入時可以存儲在一個塊中,但因後來更新導致行長增加,而塊的自由空間已經完全滿了,此時產生行遷移,將整行的數據遷移到一個新的數據塊上,而將該行原先的空間只放一個指針,指向該行的新的位置。
行鏈接:當第一次插入數據時一個塊就不能存下一行記錄的情況下,系統將使用鏈接在多個塊中存儲該記錄。
SQL> create tablespace tb2 datafile't.dbf' size 10M;
Tablespace created.
SQL> create table t3 (x int,yvarchar2(200)) pctfree 0;
Table created.
SQL> create table t4 (x int,yvarchar2(200)) pctfree 20;
Table created.
SQL> begin
2 for I in 1..4000
3 loop
4 insert into t3 values(I,'aaaaaaaaaa');
5 insert into t4 values(I,'aaaaaaaaaa');
6 end loop;
7 commit;
8 end;
9 /
PL/SQL procedure successfully completed
SQL> select extent_id,blocks,block_idfrom dba_extents wheresegment_name='T3';
EXTENT_ID BLOCKS BLOCK_ID
--------- ------ --------
0 8 63537
1 8 64041
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='T4';
EXTENT_ID BLOCKS BLOCK_ID
--------- ------ --------
0 8 63569
1 8 63897
SQL> analyze table t3 computestatistics;
Table analyzed.
SQL> analyze table t4 computestatistics;
Table analyzed.
SQL> select chain_cnt from dba_tableswhere table_name='T3';
CHAIN_CNT
---------
0
SQL> select chain_cnt from dba_tableswhere table_name='T4';
CHAIN_CNT
---------
0
SQL> update t3 set y='aaaaaaaaaaa';
4000 rows updated.
SQL> update t4 set y='aaaaaaaaaaa';
4000 rows updated.
SQL> commit;
Commit complete.
SQL> analyze table t3 computestatistics;
Table analyzed.
SQL> analyze table t4 computestatistics;
Table analyzed.
SQL> select chain_cnt from dba_tableswhere table_name='T3';【行鏈接信息】
CHAIN_CNT
---------
402
SQL> select chain_cnt from dba_tableswhere table_name='T4';
CHAIN_CNT
---------
0
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='T3';
EXTENT_ID BLOCKS BLOCK_ID
--------- ------ --------
0 8 63537
1 8 64041
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='T4';
EXTENT_ID BLOCKS BLOCK_ID
--------- ------ --------
0 8 63569
1 8 63897
SQL> selecttablespace_name,segment_space_management from dba_tablespaces;
【查詢表空間的段空間管理方式,ASSM方式下建立的表將忽略pct_used參數】
TABLESPACE_NAME SEGMEN
------------------------------ ------
SYSTEM MANUAL
UNDOTBS1 MANUAL
SYSAUX AUTO
TEMP MANUAL
USERS AUTO
EXAMPLE AUTO
I AUTO
TEST AUTO
TEST2 AUTO
TEMP1 MANUAL
TEST4 AUTO
TEST5 AUTO
T1 AUTO
T2 AUTO
CWDATA AUTO
CWINDEX AUTO
TEMP2 MANUAL
TEMP3 MANUAL
TEMP4 MANUAL
TB1 AUTO
UNDOTBS02 MANUAL
TB2 AUTO
SQL> create table test1 (id char(2));
【使用系統默認pctfree/pctused參數】
Table created.
SQL> create table test2 (id char(2))pctfree 20 pctused 50 tablespace system;
【在system表空間(MSSM段空間管理方式)中指定表的pctfree/pctused值】
Table created.
SQL> create table test3 (id char(2))pctfree 20 pctused 50 tablespace users;
【在users表空間(ASSM段空間管理方式)中指定表的pctfree/pctused值】
Table created.
SQL> select table_name,pct_free,pct_usedfrom user_tables where table_name in ('TEST1','TEST2','TEST3');
【查詢表的pct_free 和pctused值】
TABLE_NAME PCT_FREE PCT_USED
------------------------------ ----------------
TEST1 10 40
TEST2 20 50
TEST3 20
Free list & free group
在segment中,若同一時刻發生多個Insert,將 引起free list爭用,故一個segment中一般存在多個free list。Free list 的多少決定了同一時刻可以在同一segment中進行insert操作的數量,多個free list 又可歸屬於不同的free list group ,free list group 用於進一步將一個段頭塊中的多個freelist分散到多個塊中去,進一步減少段頭塊的訪問競爭。
SQL> create table t5 (a int,b char(6));
Table created.
SQL> selectsegment_name,freelists,freelist_groups from dba_segments where segment_name='T5';
SEGMENT_NAME FREELISTS FREELIST_GROUPS
------------------------------------------------------------------------------------------ ---------------
T5 1
1
SQL> alter table t5 storage (freelists5);
Table altered.
SQL> select segment_name,freelists,freelist_groupsfrom dba_segments where segment_name='T5';
SEGMENT_NAME FREELISTS FREELIST_GROUPS
------------------------------------------------------------------------------------------ ---------------
T5 5 1
SQL> create table t6(a int,b char(16)) storage (freelists 4 freelist groups2);
Table created.
SQL> selectsegment_name,freelists,freelist_groups from dba_segments where segment_name='T6';
SEGMENT_NAME FREELISTS FREELIST_GROUPS
------------------------------------------------------------------------------------------ ---------------
T6 4 2
當freelist group=1時,freelist都存儲在segment header(第一個塊)內,真正數據的存儲就從第2塊開始。當freelist group >1時,freelist從segment header內分離出來,存儲在單獨的塊裏面,每個freelist group佔一個block,即真正數據的存儲就從1(for segment header)+n(free list group數量)塊之後的塊開始。
Free list & HWM(high water mark)
一個表若預分配100萬個block(如果使用較大的initial extent 參數),則oracle不會講全部100萬個block都放到free list鏈表上,否則維護量太大,而是使用HWM進行解決。
HWM是一個標記,用來標記segment中有多少block是“已被用過”的,有多少block是“從未被用過”的。只要一block被用過,其就位於HWM以下了,即使塊中數據全刪掉,該塊也仍位於HWM以下,即HWM只升不降。該塊也仍位於HWM以下,即HWM只升不降。
HWM的好處是減小了freelist上,即Oracle總使自己用過的空閒塊進行Insert,避免了空間浪費同時提高了free list的性能和可管理性;同時在需要掃描整個segment中數據塊時,因HWM存在,也只需掃描HWM以下的塊,從而提高了性能。
SQL> create table t7 (a int,b char(10));
Table created.
SQL> analyze table t7 computestatistics;
Table analyzed.
SQL> select blocks,empty_blocks from dba_tables where table_name='T7';
BLOCKS EMPTY_BLOCKS
------ ------------
0 7
SQL> selectextent_id,block_id,blocks from dba_extents where segment_name='T7';
EXTENT_IDBLOCK_ID BLOCKS
----------------- ------
0 63601 8
SQL> selectsegment_name,header_file,header_block,blocks from dba_segments wheresegment_name='T7';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------------------------------------------------------------------------------- ------------ ------
T7 1 63601 8
SQL> altersystem dump datafile 1 block 63601;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_19189.trc
#blocks in seg. hdr's freelists: 0
#blocks below: 0
SQL> begin
2 forI in 1..2000
3 loop
4 insert into t7 values (I,'aaaaaaaaaa');
5 endloop;
6 commit;
7 end;
8 /
PL/SQL proceduresuccessfully completed.
SQL> analyzetable t7 compute statistics;
Table analyzed.
SQL> selectblocks,empty_blocks from dba_tables where table_name='T7';
BLOCKS EMPTY_BLOCKS
------ ------------
7 0
SQL> selectextent_id,block_id,blocks from dba_extents where segment_name='T7';
EXTENT_IDBLOCK_ID BLOCKS
----------------- ------
0 63601 8
SQL> selectsegment_name,header_file,header_block,blocks from dba_segments wheresegment_name='T7';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------------------------------------------------------------------------------- ------------ ------
T7 1 63601 8
SQL> altersystem dump datafile 1 block 63601;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_19189.trc
Highwater:: 0x0040f879 ext#: 0 blk#: 7 ext size: 7
#blocks in seg. hdr's freelists: 2
#blocks below: 7
mapblk 0x00000000 offset: 0
SQL> begin
2 forI in 2001..4000
3 loop
4 insert into t7 values (I,'aaaaaaaaaa');
5 endloop;
6 commit;
7 end;
8 /
PL/SQL proceduresuccessfully completed.
SQL> analyzetable t7 compute statistics;
Table analyzed.
SQL> selectblocks,empty_blocks from dba_tables where table_name='T7';
BLOCKSEMPTY_BLOCKS
------------------
12 3
SQL> selectextent_id,block_id,blocks from dba_extents where segment_name='T7';
EXTENT_IDBLOCK_ID BLOCKS
----------------- ------
0 63601 8
1 64049 8
SQL> selectsegment_name,header_file,header_block,blocks from dba_segments wheresegment_name='T7';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------------------------------------------------------------------------------- ------------ ------
T7 1 63601 16
SQL> altersystem dump datafile 1 block 63601;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_19189.trc
Highwater:: 0x0040fa36 ext#: 1 blk#: 5 ext size: 8
#blocks in seg. hdr's freelists: 1
#blocks below: 12
mapblk 0x00000000 offset: 1
SQL> deletefrom t7 where a>500;
3500 rowsdeleted.
SQL> commit;
Commit complete.
SQL> analyzetable t7 compute statistics;
Table analyzed.
SQL> selectblocks,empty_blocks from dba_tables where table_name='T7';
BLOCKSEMPTY_BLOCKS
------------------
12 3
SQL> selectextent_id,block_id,blocks from dba_extents where segment_name='T7';
EXTENT_IDBLOCK_ID BLOCKS
----------------- ------
0 63601 8
1 64049 8
SQL> select segment_name,header_file,header_block,blocksfrom dba_segments where segment_name='T7';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------------------------------------------------------------------------------- ------------ ------
T7 1 63601 16
SQL> altersystem dump datafile 1 block 63601;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_19189.trc
Highwater:: 0x0040fa36 ext#: 1 blk#: 5 ext size: 8
#blocks in seg. hdr's freelists: 11
#blocks below: 12
mapblk 0x00000000 offset: 1
Unlocked
HWM太高,HWM下空閒塊過多的解決辦法:
1. recreate table;
2. truncate table;
3. alter talbe shrink space;(forora10g &ASSM)
數據塊頭(包含塊頭,表目錄區,行目錄區)組成:
1. 定長部分數據:記錄block type(即segment type),block 地址等。
2. 變長部分數據:行地址,ITL(interestedtransaction list 有效事務列表)等。
ITL實際爲block header中的一段用於保存數據的數據結構,稱爲ITL slot,其中保存的數據包括block中關於事務信息的記錄,包括List編號、回滾段地址、事務狀態,事務在該block影響的記錄條數等。
每個需要存取該數據塊的事務都需先獲得一個該數據塊的ITL slot,因此一個數據塊上ITL slot入口的多少決定該數據塊支持併發事務數量的多少,可在create table時以inittans(默認1)和maxtrans(默認255)參數指定初始和最大ITL slot數。當initrans<=2時,每個分配的數據塊中都會有2個ITL slot,當ITL slot不夠用時,oracle會動態增加ITL slot的數量。
SQL> create table t8 (x int,y varchar2(200)) pctfree 0;
Table created.
SQL> select ini_trans,max_trans from dba_tables where table_name='T8';
INI_TRANS MAX_TRANS
---------- ----------
1 255
SQL> begin
2 for I in 1..4000
3 loop
4 insert into t8 values (I,'aaaaaaaaaa');
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> select extent_id,blocks,block_id from dba_extents wheresegment_name='T8';
EXTENT_ID BLOCKS BLOCK_ID
---------- ---------- ----------
0 8 64057
1 8 64065
SQL> select rowid from t8 where x=1;
ROWID
------------------
AAANkBAABAAAPo6AAA
SQL> select rowid from t8 where x=2;
ROWID
------------------
AAANkBAABAAAPo6AAB
SQL> select rowid from t8 where x=3;
ROWID
------------------
AAANkBAABAAAPo6AAC
SQL> select dbms_rowid.rowid_block_number('AAANkBAABAAAPo6AAA')from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANKBAABAAAPO6AAA')
---------------------------------------------------
64058
SQL> select dbms_rowid.rowid_block_number('AAANkBAABAAAPo6AAB')from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANKBAABAAAPO6AAB')
---------------------------------------------------
64058
SQL> select dbms_rowid.rowid_block_number('AAANkBAABAAAPo6AAC')from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANKBAABAAAPO6AAC')
---------------------------------------------------
64058
SQL> update t8 set x=1 where x=1;
1 row updated.
SQL> updatet8 set x=2 where x=2;
2 row updated.
SQL> update t8 set x=3 where x=3;
SQL> commit
2 ;
Commit complete.
SQL> update t8 set x=3 where x=3;
1 row updated.
SQL> select rowid from scott.emp;
ROWID
------------------
AAAMfMAAEAAAAAcAAA
AAAMfMAAEAAAAAgAAA
AAAMfMAAEAAAAAgAAB
AAAMfMAAEAAAAAgAAC
AAAMfMAAEAAAAAgAAD
AAAMfMAAEAAAAAgAAE
AAAMfMAAEAAAAAgAAF
AAAMfMAAEAAAAAgAAG
AAAMfMAAEAAAAAgAAH
AAAMfMAAEAAAAAgAAI
AAAMfMAAEAAAAAgAAJ
AAAMfMAAEAAAAAgAAK
AAAMfMAAEAAAAAgAAL
AAAMfMAAEAAAAAgAAM
AAAMfMAAEAAAAAgAAN
15 rows selected.
A-Z:0-25 , a-z: 26-51, 0-9: 52-61, /:62, +:63
SQL> selectdbms_rowid.rowid_object('AAAMfMAAEAAAAAgAAN') from dual;
DBMS_ROWID.ROWID_OBJECT('AAAMFMAAEAAAAAGAAN')
---------------------------------------------
51148
SQL> select object_name from dba_objectswhere object_id=&1;
Enter value for 1: 51148
old 1: select object_name from dba_objects where object_id=&1
new 1: select object_name from dba_objects where object_id=51148
OBJECT_NAME
----------------------------------------------------------------------------------------------------
EMP
SQL> selectdbms_rowid.rowid_object('AAANkBAABAAAPo6AAA') from dual;
DBMS_ROWID.ROWID_OBJECT('AAANKBAABAAAPO6AAA')
---------------------------------------------
55553
SQL> select object_name from dba_objectswhere object_id=&1;
Enter value for 1: 55553
old 1: select object_name from dba_objects where object_id=&1
new 1: select object_name from dba_objects where object_id=55553
OBJECT_NAME
----------------------------------------------------------------------------------------------------
T8
SQL> selectdbms_rowid.rowid_relative_fno('AAANkBAABAAAPo6AAA') from dual;
DBMS_ROWID.ROWID_RELATIVE_FNO('AAANKBAABAAAPO6AAA')
---------------------------------------------------
1
SQL> select file_name fromdba_data_files where file_id=&2;
Enter value for 2: 1
old 1: select file_name from dba_data_files where file_id=&2
new 1: select file_name from dba_data_files where file_id=1
FILE_NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/ora10/system01.dbf
SQL> select dbms_rowid.rowid_relative_fno('AAAMFMAAEAAAAAGAAM')from dual;
DBMS_ROWID.ROWID_RELATIVE_FNO('AAAMFMAAEAAAAAGAAM')
---------------------------------------------------
4
SQL> select file_name fromdba_data_files where file_id=&2;
Enter value for 2: 4
old 1: select file_name from dba_data_files where file_id=&2
new 1: select file_name from dba_data_files where file_id=4
FILE_NAME
----------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/ora10/users01.dbf
SQL> selectdbms_rowid.rowid_block_number('AAANkBAABAAAPo6AAA') from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANKBAABAAAPO6AAA')
---------------------------------------------------
64058
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='T8';
EXTENT_ID BLOCKS BLOCK_ID
---------- ---------- ----------
0 8 64057
1 8 64065
SQL> selectdbms_rowid.rowid_row_number('AAANkBAABAAAPo6AAA') from dual;
DBMS_ROWID.ROWID_ROW_NUMBER('AAANKBAABAAAPO6AAA')
-------------------------------------------------
0
SQL> selectdbms_rowid.rowid_row_number('AAANkBAABAAAPo6AAB') from dual;
DBMS_ROWID.ROWID_ROW_NUMBER('AAANKBAABAAAPO6AAB')
-------------------------------------------------
1
SQL> alter system dump datafile 1 block64058;
System altered.
[oracle@desktop241 udump]$ vimora10_ora_7438.trc
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000b.019.00000041 0x050015b4.001c.2c --U- 1 fsc 0x0000.001e763d
0x02 0x0014.00b.0000003d 0x05000d08.0028.10 --U- 1 fsc 0x0000.001e7885
data_block_dump,data header at 0xdf2445c
===============
SQL> selectdbms_rowid.rowid_block_number ('AAAMFMAAEAAAAAGAAM') from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAAMFMAAEAAAAAGAAM')
---------------------------------------------------
6
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='EMP';
EXTENT_ID BLOCKS BLOCK_ID
---------- ---------- ----------
0 8 25
Free list和ITL都影響併發性,區別如下:
1. ITL影響block層的併發性,free list影響segment層的併發性;
2. ITL影響併發的事務,freee list 影響併發的insert操作;
3. 事務進行全程均佔用ITL,事務結束後釋放;insert僅在事務進行前搜索佔用freelist ,事務進行時free list已釋放;
塊清除block cleanouts
當事物commit時,block中的ITL被清除,稱爲block cleanouts.
Fast block cleanouts
Commit時若需cleanouts的塊位於buffer cache,則立即清除ITL(fast block cleanouts),若事物太大,需要清除的塊數量大於buffer cache的10%,則暫隻立即清除10%以內的部分。
Delalyed block cleanouts
Commit時若需cleanouts的塊已寫到磁盤,則延時清除ITL(delayed block cleanouts),若事物太大,需要清除的塊數量大於buffer cache的10%,則10%以外的部分進行延時清除。延時清除將在塊被再次訪問時進行,以提高commit的性能。
SQL> createtable test as select * from dba_objects;
Table created.
SQL> setautot on stat;
SQL> altersession set events='immediate trace name flush_cache';
Session altered.
SQL> commit;
Commit complete.
SQL> selectcount(*) from test;
COUNT(*)
----------
50793
Statistics
----------------------------------------------------------
28 recursive calls
0 db block gets
777 consistent gets
698 physical reads
0 redo size
413 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> selectcount (*) from test;
COUNT(*)
----------
50793
Statistics
----------------------------------------------------------
4 recursive calls
0 db block gets
775 consistent gets
0 physical reads
0 redo size
413 bytes sent via SQL*Net to client
400 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
補充:
MSSM段管理方式
SQL> create table a1 (a number,bchar(30)) tablespace system;
Table created.
SQL> begin
2 For I in 1..2000 loop
3 insert into a1 values(I,'aaaaaaaaaa');
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select extent_id,blocks,block_idfrom dba_extents where segment_name='A1';
EXTENT_ID BLOCKS BLOCK_ID
---------- ---------- ----------
0 8 64409
1 8 64417
SQL> select header_file,header_blockfrom dba_segments where segment_name='A1';
HEADER_FILE HEADER_BLOCK
----------- ------------
1 64409
SQL> alter system dump datafile&HEADER_FILE block &HEADER_BLOCK;
Enter value for header_file: 1
Enter value for header_block: 64409
old 1: alter system dump datafile &HEADER_FILE block &HEADER_BLOCK
new 1: alter system dump datafile 1 block 64409
System altered.
Extent Header:: spare1: 0 spare2: 0 #extents: 2 #blocks: 15
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x0040fba6 ext#: 1 blk#: 5 ext size: 8
#blocks in seg. hdr's freelists: 1
#blocks below: 12
mapblk 0x00000000 offset: 1
Unlocked
SQL> select rowid from a1 where a=1;
ROWID
------------------
AAANkEAABAAAPuaAAA
SQL> selectdbms_rowid.rowid_block_number('AAANkEAABAAAPuaAAA') from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAANKEAABAAAPUAAAA')
---------------------------------------------------
64410
System表空間爲MSSM管理方式,由freelist鏈表管理段內空閒空間,上述可見所有已分配extent內所包含block中,僅第一個block爲段頭信息(存放freelist 及HWM信息,可dump後查看),其餘均爲數據塊,第一條數據即是從第二個塊開始插入的。
SQL> createtablespace tb2 datafile '/u01/tb2.dat' size 10M;
Tablespacecreated.
SQL> alterdatabase datafile '/u01/tb2.dat' autoextend on;
Databasealtered.
SQL> createtable a2 tablespace tb2 as select * from dba_objects;
Table created.
SQL> selectextent_id,blocks,block_id from dba_extents where segment_name='A2';
EXTENT_ID BLOCKS BLOCK_ID
-------------------- ----------
0 8 9【一級位圖塊】10【二級位圖塊】11【區的編號和二級位圖地址】【三個塊存放控制信息】
1 8 17
2 8 25【一個塊存放控制信息】
3 8 33
4 8 41【一個塊存放控制信息】
5 8 49
6 8 57
7 8 65
8 8 73
9 8 81
10 8 89
11 8 97
12 8 105
13 8 113
14 8 121
15 8 129
16 128 137【2個塊存放控制信息】【126 個塊存放數據】
17 128 265【2個塊存放控制信息】【每個控制塊管理64個數據塊】
18 128 393
19 128 521
20 128 649
SQL> altersystem dump datafile 21 block 41;
System altered.
Dump of FirstLevel Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0540000a poffset: 2
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 55557
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x05400029 Length: 8 Offset: 0
0x05400031 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 41 maxblk 41
SQL> select header_file,header_blockfrom dba_segments where segment_name='A2';
HEADER_FILEHEADER_BLOCK
-----------------------
21 11
2
SQL> alter system dump datafile21 block 11;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_16134.trc
Extent ControlHeader
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 21 #blocks: 768
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x054002d7 ext#: 20 blk#: 78 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 718
mapblk 0x00000000 offset: 20
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x054002d7 ext#: 20 blk#: 78 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 718
mapblk 0x00000000 offset: 20
Level 1 BMB for High HWM block: 0x0540028a
Level 1 BMB for Low HWM block: 0x0540028a
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0540000a
Last Level 1 BMB: 0x0540028a
Last Level II BMB: 0x0540000a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 21 obj#: 55557 flag: 0x10000000
Inc # 0
Extent Map【區圖】
-----------------------------------------------------------------
0x05400009 length: 8
0x05400011 length: 8
0x05400019 length: 8
0x05400021 length: 8
0x05400029 length: 8
0x05400031 length: 8
0x05400039 length: 8
0x05400041 length: 8
0x05400049 length: 8
0x05400051 length: 8
0x05400059 length: 8
0x05400061 length: 8
0x05400069 length: 8
0x05400071 length: 8
0x05400079 length: 8
0x05400081 length: 8
0x05400089 length: 128
0x05400109 length: 128
0x05400189 length: 128
0x05400209 length: 128
0x05400289 length: 128
Auxillary Map【所有區的編號】
--------------------------------------------------------
Extent 0 : L1 dba: 0x05400009 Data dba: 0x0540000c
Extent 1 : L1 dba: 0x05400009 Data dba: 0x05400011
Extent 2 : L1 dba: 0x05400019 Data dba: 0x0540001a
Extent 3 : L1 dba: 0x05400019 Data dba: 0x05400021
Extent 4 : L1 dba: 0x05400029 Data dba: 0x0540002a
Extent 5 : L1 dba: 0x05400029 Data dba: 0x05400031
Extent 6 : L1 dba: 0x05400039 Data dba: 0x0540003a
Extent 7 : L1 dba: 0x05400039 Data dba: 0x05400041
Extent 8 : L1 dba: 0x05400049 Data dba: 0x0540004a
Extent 9 : L1 dba: 0x05400049 Data dba: 0x05400051
Extent 10 : L1 dba: 0x05400059 Data dba: 0x0540005a
Extent 11 : L1 dba: 0x05400059 Data dba: 0x05400061
Extent 12 : L1 dba: 0x05400069 Data dba: 0x0540006a
Extent 13 : L1 dba: 0x05400069 Data dba: 0x05400071
Extent 14 : L1 dba: 0x05400079 Data dba: 0x0540007a
Extent 15 : L1 dba: 0x05400079 Data dba: 0x05400081
Extent 16 : L1 dba: 0x05400089 Data dba: 0x0540008b
Extent 17 : L1 dba: 0x05400109 Data dba: 0x0540010b
Extent 18 : L1 dba: 0x05400189 Data dba: 0x0540018b
Extent 19 : L1 dba: 0x05400209 Data dba: 0x0540020b
Extent 20 : L1 dba: 0x05400289 Data dba: 0x0540028b
--------------------------------------------------------
Second Level Bitmap block DBAs【二級位圖塊地址】
--------------------------------------------------------
DBA 1: 0x0540000a
End dump datablocks tsn: 28 file#: 21 minblk 11 maxblk 11
SQL> alter system dump datafile21 block 10;
[oracle@desktop241udump]$ vim ora10_ora_16480.trc
Dump of Second Level Bitmap Block【二級位圖塊】
number: 18 nfree: 1 ffree: 17 pdba: 0x0540000b
Inc #: 0 Objd: 55557
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x05400009 Free: 1 Inst: 1
0x05400019 Free: 1 Inst: 1
0x05400029 Free: 1 Inst: 1
0x05400039 Free: 1 Inst: 1
0x05400049 Free: 1 Inst: 1
0x05400059 Free: 1 Inst: 1
0x05400069 Free: 1 Inst: 1
0x05400079 Free: 1 Inst: 1
0x05400089 Free: 1 Inst: 1
0x0540008a Free: 1 Inst: 1
0x05400109 Free: 1 Inst: 1
0x0540010a Free: 1 Inst: 1
0x05400189 Free: 1 Inst: 1
0x0540018a Free: 1 Inst: 1
0x05400209 Free: 1 Inst: 1
0x0540020a Free: 1 Inst: 1
0x05400289 Free: 1 Inst: 1
0x0540028a Free: 5 Inst: 1
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 10 maxblk 10
SQL> alter system dump datafile21 block 9;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_16571.trc
Dump of First Level Bitmap Block【一級位圖塊】
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0540000a poffset: 0
unformatted: 0 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 55557
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x05400009 Length: 8 Offset: 0
0x05400011 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 9 maxblk 9
SQL> alter system dump datafile21 block 25;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_16714.trc
Dump of FirstLevel Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0540000a poffset: 1
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 55557
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x05400019 Length: 8 Offset: 0
0x05400021 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 25 maxblk 25
SQL> alter system dump datafile21 block 137;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_16771.trc
Dump of FirstLevel Bitmap Block
--------------------------------
nbits: 4 nranges: 1 parent dba: 0x0540000a poffset: 8
unformatted: 0 total: 64 first useful block: 2
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 64
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 55557
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x05400089 Length: 64 Offset: 0
0:Metadata 1:Metadata 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
16:FULL 17:FULL 18:FULL 19:FULL
20:FULL 21:FULL 22:FULL 23:FULL
24:FULL 25:FULL 26:FULL 27:FULL
28:FULL 29:FULL 30:FULL 31:FULL
32:FULL 33:FULL 34:FULL 35:FULL
36:FULL 37:FULL 38:FULL 39:FULL
40:FULL 41:FULL 42:FULL 43:FULL
44:FULL 45:FULL 46:FULL 47:FULL
48:FULL 49:FULL 50:FULL 51:FULL
52:FULL 53:FULL 54:FULL 55:FULL
56:FULL 57:FULL 58:FULL 59:FULL
60:FULL 61:FULL 62:FULL 63:FULL
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 137 maxblk 137
SQL> altersystem dump datafile 21 block 138;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_17269.trc
Dump of FirstLevel Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x0540000a poffset: 9
unformatted: 0 total: 64 first useful block: 0
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map BlockOffset: 4294967295
First free datablock : 64
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 55557
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x054000c9 Length: 64 Offset: 0
0:FULL 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
16:FULL 17:FULL 18:FULL 19:FULL
20:FULL 21:FULL 22:FULL 23:FULL
24:FULL 25:FULL 26:FULL 27:FULL
28:FULL 29:FULL 30:FULL 31:FULL
32:FULL 33:FULL 34:FULL 35:FULL
36:FULL 37:FULL 38:FULL 39:FULL
40:FULL 41:FULL 42:FULL 43:FULL
44:FULL 45:FULL 46:FULL 47:FULL
48:FULL 49:FULL 50:FULL 51:FULL
52:FULL 53:FULL 54:FULL 55:FULL
56:FULL 57:FULL 58:FULL 59:FULL
60:FULL 61:FULL 62:FULL 63:FULL
--------------------------------------------------------
End dump datablocks tsn: 28 file#: 21 minblk 138 maxblk 138
SQL> altersystem dump datafile 21 block 139;
System altered.
[oracle@desktop241udump]$ vim ora10_ora_17343.trc
全部是數據
新建tb2表空間默認爲ASSM管理方式,由位圖管理段內空閒空間,上述可見所有已分配extent內所包含block中,第3個block爲段頭信息(存放所有區的編號及二級位圖塊地址,可dump後查看),第2個塊爲二級位圖塊,第1個塊爲一級位圖塊。