ORACLE--逻辑架构(一)
上一次在说到数据库体系架构时已经提及数据库逻辑架构,逻辑架构主要包含:tablespace->segment->extent->block->os-block以及datafile,也说明了其中数据文件的部分管理方式,这里接着从这里开始说起比较好:
1、系统提供每一个表空间说明
2、大文件表空间
3、表空间文件主从关系
4、EXTENTS与SEGMENTS
5、高水位线介绍
6、DELETE、TRUNCATE、DROP、SHRINK SPACE区别
7、BLOCK存储原理
付:本来应该将SEGMENT一起说明的,不过SEGMENT是说明起来最复杂,也是体系架构中最终的关键部分,所以SEGMENT以后单独写一篇文章说明;而本文中最复杂的部分在“块”的说明中。
1、系统提供每一个表空间说明
首先查看有哪些表空间:
SQL> select tablespace_name,CONTENTS
2 from dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ ---------
SYSTEM PERMANENT
UNDOTBS1 UNDO
SYSAUX PERMANENT
TEMP TEMPORARY
USERS PERMANENT
EXAMPLE PERMANENT
其中:
PERMANENT:表示永久表空间
UNDO:回退表空间
TEMPORARY:表示为临时表空间。
SYSTEM:是整个数据库最重要的表空间,存储的是数据字典,表的定义、视图定义、存储过程定义、用户信息、索引信息等都放于系统表空间中,系统表空间必须在线,其余都依赖于这个表空间存在,付:这个表空间不允许改名字。
SYSAUX:10g后新特性,系统辅助表空间(ORACLE 7i的系统表空间只有不到70M,8i不到200M,9i达到400M以上),后来将一些最核心的要保留较小,将最核心的留在SYSTEM表空间,其余的放置于SYSAUX表空间,付:系统内部这个表空间不允许改名字。
其余表空间都可以改名字,就这两个表空间不允许改名字。
SQL> select table_name from dict where table_name like '%AUX%';
TABLE_NAME
------------------------------
GV$SYSAUX_OCCUPANTS
V$SYSAUX_OCCUPANTS
SQL> desc V$SYSAUX_OCCUPANTS
名称
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
OCCUPANT_NAME
OCCUPANT_DESC
SCHEMA_NAME
MOVE_PROCEDURE
MOVE_PROCEDURE_DESC
SPACE_USAGE_KBYTES
SQL> COL OCCUPANT_NAME for a35
SQL> col OCCUPANT_DESC for a60
SQL> col SCHEMA_NAME for a30
SQL> col MOVE_PROCEDURE for a50
SQL> col SPACE_USAGE_KBYTES for 9999999999999999
SQL> set lines 260
SQL> select OCCUPANT_NAME,OCCUPANT_DESC,MOVE_PROCEDURE,SPACE_USAGE_KBYTES
2 FROM V$SYSAUX_OCCUPANTS;
OCCUPANT_NAME OCCUPANT_DESC MOVE_PROCEDURE SPACE_USAGE_KBYTES
----------------------------------- ------------------------------------------------------------ -------------------------------------------------- ------------------
LOGMNR LogMiner SYS.DBMS_LOGMNR_D.SET_TABLESPACE 6080
LOGSTDBY Logical Standby SYS.DBMS_LOGSTDBY.SET_TABLESPACE 896
STREAMS Oracle Streams 512
XDB XDB XDB.DBMS_XDB.MOVEXDB_TABLESPACE 49600
AO Analytical Workspace Object Table DBMS_AW.MOVE_AWMETA 21248
XSOQHIST OLAP API History Tables DBMS_XSOQ.OlapiMoveProc 21248
XSAMD OLAP Catalog DBMS_AMD.Move_OLAP_Catalog 15936
SM/AWR Server Manageability - Automatic Workload Repository 19520
SM/ADVISOR Server Manageability - Advisor Framework 4928
SM/OPTSTAT Server Manageability - Optimizer Statistics History 3968
SM/OTHER Server Manageability - Other Components 4992
OCCUPANT_NAME OCCUPANT_DESC MOVE_PROCEDURE SPACE_USAGE_KBYTES
----------------------------------- ------------------------------------------------------------ -------------------------------------------------- ------------------
STATSPACK Statspack Repository 0
ODM Oracle Data Mining MOVE_ODM 256
SDO Oracle Spatial MDSYS.MOVE_SDO 41536
WM Workspace Manager DBMS_WM.move_proc 7040
ORDIM Oracle interMedia ORDSYS Components 512
ORDIM/PLUGINS Oracle interMedia ORDPLUGINS Components 0
ORDIM/SQLMM Oracle interMedia SI_INFORMTN_SCHEMA Components 0
EM Enterprise Manager Repository emd_maintenance.move_em_tblspc 50880
TEXT Oracle Text DRI_MOVE_CTXSYS 4736
ULTRASEARCH Oracle Ultra Search MOVE_WK 0
ULTRASEARCH_DEMO_USER Oracle Ultra Search Demo User MOVE_WK 0
OCCUPANT_NAME OCCUPANT_DESC MOVE_PROCEDURE SPACE_USAGE_KBYTES
----------------------------------- ------------------------------------------------------------ -------------------------------------------------- ------------------
EXPRESSION_FILTER Expression Filter System 3712
EM_MONITORING_USER Enterprise Manager Monitoring User 1600
TSM Oracle Transparent Session Migration User 256
JOB_SCHEDULER Unified Job Scheduler 384
可以发现这些应用都是应用级别的,并非绝对的,所以放置于系统辅助表空间中,字段说明:
OCCUPANT_NAME:应用的名字
OCCUPANT_DESC:应用的描述信息
MOVE_PROCEDURE:要将其移动到另一个地方,需要使用哪一个过程。
USER表空间:本来是很普通的表空间,在10g后有一个新特性:
SQL> COL PROPERTY_NAME FOR A60
SQL> COL PROPERTY_VALUE FOR A35
SQL> COL DESCRIPTION FOR A60
SQL> l
1* SELECT * FROM DATABASE_PROPERTIES
SQL> /
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- ------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET ZHS16GBK Character set
NLS_CALENDAR GREGORIAN Calendar system
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- ------------------------------------
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- ------------------------------------
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.1.0 RDBMS version for NLS parameters
GLOBAL_DB_NAME ORCL103.REGRESS.RDBMS.DEV.US.ORACLE Global database name
.COM
EXPORT_VIEWS_VERSION 8 Export views revision #
DBTIMEZONE 00:00 DB time zone
SQL> alter database default tablespace SYSTEM;
数据库已更改。
SQL> SELECT * FROM DATABASE_PROPERTIES;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- -------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE SYSTEM Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA ISO currency
NLS_NUMERIC_CHARACTERS ., Numeric characters
NLS_CHARACTERSET ZHS16GBK Character set
NLS_CALENDAR GREGORIAN Calendar system
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- -------------------------------------
NLS_DATE_FORMAT DD-MON-RR Date format
NLS_DATE_LANGUAGE AMERICAN Date language
NLS_SORT BINARY Linguistic definition
NLS_TIME_FORMAT HH.MI.SSXFF AM Time format
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM Time stamp format
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR Time with timezone format
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR Timestamp with timezone format
NLS_DUAL_CURRENCY $ Dual currency symbol
NLS_COMP BINARY NLS comparison
NLS_LENGTH_SEMANTICS BYTE NLS length semantics
NLS_NCHAR_CONV_EXCP FALSE NLS conversion exception
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------------------------------------ ----------------------------------- -------------------------------------
NLS_NCHAR_CHARACTERSET AL16UTF16 NCHAR Character set
NLS_RDBMS_VERSION 10.2.0.1.0 RDBMS version for NLS parameters
GLOBAL_DB_NAME ORCL103.REGRESS.RDBMS.DEV.US.ORACLE Global database name
.COM
EXPORT_VIEWS_VERSION 8 Export views revision #
DBTIMEZONE 00:00 DB time zone
默认表空间分系统级别和用户级别,DATABASE级别的创建后,如果创建用户不使用DEFALUT TABLESPACE指定,那么它就用DATABASE指定的DEFAULT TABLEPSACE了
2、大文件表空间
SQL> SELECT TABLESPACE_NAME,BIGFILE FROM DBA_TABLESPACES;
TABLESPACE_NAME BIG
------------------------------ ---
SYSTEM NO
UNDOTBS1 NO
SYSAUX NO
TEMP NO
USERS NO
EXAMPLE NO
大文件表空间的特性:
1、文件头大,从普通的8个块,可以到16个块。
2、长大到4G个块,每个块为8K,即每个数据文件可以达到32T大小,也就是一个表空间的最大的大小。
3、一个表空间至于一个数据文件,即表空间的最大大小不会变化。
为什么:ROWID决定,所谓大文件就是将文件编号的的区域划分给块编号了,所以一个数据文件可以存放更大的空间。
SQL> create bigfile tablespace tt2 datafile 'D:/ORACLE/ORADATA/ORCL103/DATAFILE/TT2.DBF' size 1m;
表空间已创建。
SQL> select * from dba_free_space;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
SYSTEM 1 61161 262144 32 1
SYSTEM 1 61961 6225920 760 1
UNDOTBS1 2 185 65536 8 2
UNDOTBS1 2 201 131072 16 2
UNDOTBS1 2 241 262144 32 2
UNDOTBS1 2 281 65536 8 2
UNDOTBS1 2 313 196608 24 2
UNDOTBS1 2 353 65536 8 2
UNDOTBS1 2 385 65536 8 2
UNDOTBS1 2 401 65536 8 2
UNDOTBS1 2 441 262144 32 2
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
UNDOTBS1 2 513 131072 16 2
UNDOTBS1 2 553 131072 16 2
UNDOTBS1 2 577 131072 16 2
UNDOTBS1 2 601 589824 72 2
UNDOTBS1 2 681 262144 32 2
UNDOTBS1 2 721 131072 16 2
UNDOTBS1 2 745 131072 16 2
UNDOTBS1 2 769 524288 64 2
UNDOTBS1 2 841 262144 32 2
UNDOTBS1 2 881 196608 24 2
UNDOTBS1 2 913 65536 8 2
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
UNDOTBS1 2 929 262144 32 2
UNDOTBS1 2 969 1769472 216 2
UNDOTBS1 2 1209 131072 16 2
UNDOTBS1 2 1233 393216 48 2
UNDOTBS1 2 3201 65536 8 2
UNDOTBS1 2 3721 851968 104 2
UNDOTBS1 2 3833 393216 48 2
UNDOTBS1 2 3889 458752 56 2
UNDOTBS1 2 3953 131072 16 2
UNDOTBS1 2 3977 1048576 128 2
UNDOTBS1 2 4233 1048576 128 2
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
UNDOTBS1 2 4369 131072 16 2
UNDOTBS1 2 4393 65536 8 2
UNDOTBS1 2 4409 589824 72 2
SYSAUX 3 30945 8650752 1056 3
USERS 4 537 917504 112 4
USERS 4 1289 131072 16 4
USERS 4 2057 11534336 1408 4
USERS 4 3481 327680 40 4
EXAMPLE 5 465 2162688 264 5
EXAMPLE 5 1313 458752 56 5
EXAMPLE 5 10265 20774912 2536 5
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
TT2 6 17 917504 112 1024
现在BLOCK_ID从第17个块开始,可使用块只有112个块。
SQL> alter database datafile 'D:/ORACLE/ORADATA/ORCL103/DATAFILE/TT2.DBF' autoextend on;
数据库已更改。
SQL> c/max_blocks/maxblocks
1* SELECT file_name,maxblocks from dba_data_files
SQL> /
FILE_NAME MAXBLOCKS
------------------------------------------------------------ ----------
D:/ORACLE/ORADATA/ORCL103/DATAFILE/O1_MF_USERS_63S35M2X_.DBF 4194302
D:/ORACLE/ORADATA/ORCL103/DATAFILE/O1_MF_SYSAUX_63S35LWS_.DB 4194302
F
D:/ORACLE/ORADATA/ORCL103/DATAFILE/O1_MF_UNDOTBS1_63S35M1Y_. 4194302
DBF
D:/ORACLE/ORADATA/ORCL103/DATAFILE/O1_MF_SYSTEM_63S35LVC_.DB 4194302
F
D:/ORACLE/ORADATA/ORCL103/DATAFILE/O1_MF_EXAMPLE_63S37HQX_.D 4194302
FILE_NAME MAXBLOCKS
------------------------------------------------------------ ----------
BF
D:/ORACLE/ORADATA/ORCL103/DATAFILE/TT2.DBF 4294967293
比普通的数据文件最大值大1024倍。
SQL> alter tablespace tt2 add datafile 'D:/ORACLE/ORADATA/ORCL103/DATAFILE/TT2.DBF' size 2m;
alter tablespace tt2 add datafile 'D:/ORACLE/ORADATA/ORCL103/DATAFILE/TT2.DBF' size 2m
*
第 1 行出现错误:
ORA-32771: 无法在大文件表空间中添加文件
大文件使用海量连续存储数据,对控制文件有好处,以前控制文件存储上百个数据文件信息,此时值存储一个即可。
SQL> ALTER TABLESPACE TBS_TEST DROP DATAFILE 'D:/ORACLE/ORADATA/ORCL102/TBS_TEST03.DBF';
表空间已更改。
SQL> ALTER TABLESPACE TBS_TEST DROP DATAFILE 'D:/ORACLE/ORADATA/ORCL102/TBS_TEST02.DBF';
表空间已更改。
SQL> drop tablespace TBS_TEST;
3、表空间文件主从关系
SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES
2 WHERE TABLESPACE_NAME='TBS_TEST';
FILE_NAME TABLESPACE_NAME
-------------------------------------------------- ------------------------------------------------
D:/ORACLE/ORADATA/ORCL102/TBS_TEST01.DBF TBS_TEST
D:/ORACLE/ORADATA/ORCL102/TBS_TEST02.DBF TBS_TEST
SQL> ALTER TABLESPACE TBS_TEST ADD DATAFILE 'D:/ORACLE/ORADATA/ORCL102/TBS_TEST03.DBF' size 1m;
表空间已更改。
SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES
2 WHERE TABLESPACE_NAME='TBS_TEST';
FILE_NAME TABLESPACE_NAME
-------------------------------------------------- ---------------------------------------------
D:/ORACLE/ORADATA/ORCL102/TBS_TEST01.DBF TBS_TEST
D:/ORACLE/ORADATA/ORCL102/TBS_TEST02.DBF TBS_TEST
D:/ORACLE/ORADATA/ORCL102/TBS_TEST03.DBF TBS_TEST
SQL> ALTER TABLESPACE TBS_TEST DROP DATAFILE 'D:/ORACLE/ORADATA/ORCL102/TBS_TEST01.DBF';
ALTER TABLESPACE TBS_TEST DROP DATAFILE 'D:/ORACLE/ORADATA/ORCL102/TBS_TEST01.DBF'
*
第 1 行出现错误:
ORA-03263: 无法删除表空间 TBS_TEST 的第一个文件
表空间已删除。
4、EXTENTS与SEGMENTS
SQL> select tablespace_name,segment_name,extents,blocks,segment_type
2 FROM dba_segments
3 WHERE OWNER='SCOTT';
TABLESPACE_NAME SEGMENT_NAME EXTENTS BLOCKS SEGMENT_TYPE
------------------------------ --------------------------------------------------------------------------------- ---------- ---------- -----
USERS PK_DEPT 1 8 INDEX
USERS DEPT 1 8 TABLE
USERS EMP 1 8 TABLE
USERS PK_EMP 1 8 INDEX
USERS BONUS 1 8 TABLE
USERS SALGRADE 1 8 TABLE
USERS TT 1 8 TABLE
USERS AAA 1 8 TABLE
USERS TABLE_01 1 8 TABLE
USERS TABLE_02 1 8 TABLE
USERS PERSON 1 8 TABLE
TABLESPACE_NAME SEGMENT_NAME EXTENTS BLOCKS SEGMENT_TYPE
------------------------------ --------------------------------------------------------------------------------- ---------- ---------- -----
USERS V_USER_OBJECTS 21 768 TABLE
USERS V_DBA_OBJECTS 21 768 TABLE
USERS TEST_OBJECTS 2 16 TABLE
USERS TEST 1 8 TABLE
ORA10TEST EMP_OTHER 1 8 TABLE
USERS TABLE_AJ_TEST 1 8 TABLE
已选择17行。
SQL> grant select any dictionary to scott;
授权成功。
SQL> CREATE TABLE AAA(COL1 NUMBER,COL2 VARCHAR2(20));
表已创建。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
也就是说一个表只要以创建就有8个BLOCKS,这8个块为表头。
分配EXTENT(范围)的三种方式:
1、创建表和索引的时候要分配EXTENTS初步的范围
2、数据量增长的时候分配额外的范围
3、手工分配范围。
先插入一些数据:
SQL> INSERT INTO AAA SELECT 1,1 FROM EMP;
已创建14行。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
发现BLOCKS没有变化,看来前8个BLOCK并不完全是头部,下面继续证明。
然后重复执行N次复制数据:
INSERT INTO AAA SELECT * FROM AAA;
当数据中途发生:
SQL> SELECT COUNT(1) FROM AAA;
COUNT(1)
----------
3584
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
1 4 57 8
此时跨越了数据文件,也有新的BLOCK_ID开始的8个块。说明EXTENT相互之间可以不连续存储,而EXTENT内部是连续分配的多个块。
继续增加N多次以后数据:
SQL> SELECT COUNT(1) FROM AAA;
COUNT(1)
----------
114688
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
1 4 57 8
2 6 1057 8
3 6 1065 8
4 6 1073 8
5 6 1081 8
6 6 1089 8
7 6 1097 8
8 6 1105 8
9 6 1113 8
10 6 1121 8
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
11 6 1129 8
12 6 1137 8
13 6 1145 8
14 6 1153 8
15 6 1161 8
16 6 1289 128
出现128块了?这么奇怪的事情,为什么变大了呢?其实当你继续插入的时候,到第72个EXTENT的时候会变成1024个块(8M),然后再到8192个块(64M)等等,这是一个规律,当ORACLE发现数据量很大的时候,分配的范围就会越来越大,因为这样方便插入,预留空间,至于细节由ORACLE自己决定。
而SEGMENT是一个更大的概念,它包含一系列相同类型并属于同一逻辑对象的EXTENT的组合,当你创建一个表或者一个索引或者一个分区的新的分区的时候都会产生一个新的SEGMENT,也就是他是逻辑对象的标志,逻辑对象上有一个OBJECT_ID和DATA_OBJECT_ID的概念,在说到TRUNCATE的时候会提及。
--当有大量输出插入时,此时可以预先分配,然后就可以预先分配空间方便插入。
分区表对某一个分区手工分配EXTENTS:
分布区表为:alter table <table_name> modify partition <partition_name> allocate extent(size 20m);
SQL> alter table AAA allocate extent(size 10m);
表已更改。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
1 4 57 8
2 6 1057 8
3 6 1065 8
4 6 1073 8
5 6 1081 8
6 6 1089 8
7 6 1097 8
8 6 1105 8
9 6 1113 8
10 6 1121 8
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
11 6 1129 8
12 6 1137 8
13 6 1145 8
14 6 1153 8
15 6 1161 8
16 6 1289 128
17 6 1417 128
18 6 1545 128
19 6 1673 128
20 6 1801 128
21 6 1929 128
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
22 6 2057 128
23 6 2185 128
24 6 2313 128
25 6 2441 128
26 6 2569 128
27 6 2697 128
28 6 2825 128
回收EXTENT:
SQL> alter table aaa deallocate unused;
表已更改。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
1 4 57 8
2 6 1057 8
3 6 1065 8
4 6 1073 8
5 6 1081 8
6 6 1089 8
7 6 1097 8
8 6 1105 8
9 6 1113 8
10 6 1121 8
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
11 6 1129 8
12 6 1137 8
13 6 1145 8
14 6 1153 8
15 6 1161 8
16 6 1289 128
17 6 1417 128
18 6 1545 128
19 6 1673 128
20 6 1801 128
SQL> DELETE FROM aaa;
分区表对某个分区的EXTENTS回收时:
alter table <table_name> modify partition <partition_name> deallocate unused keep 10m;
alter table <table_name> modify partition <partition_name> deallocate unused;
--前者为保存最小范围,即即使有更多的空间可以回收,但是要保证最小有10M的EXTENT存在
--后者为回收掉所有没有使用的EXTENT。
SQL> alter table aaa deallocate unused;
表已更改。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
1 4 57 8
2 6 1057 8
3 6 1065 8
4 6 1073 8
5 6 1081 8
6 6 1089 8
7 6 1097 8
8 6 1105 8
9 6 1113 8
10 6 1121 8
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
11 6 1129 8
12 6 1137 8
13 6 1145 8
14 6 1153 8
15 6 1161 8
16 6 1289 128
17 6 1417 128
18 6 1545 128
19 6 1673 128
20 6 1801 128
发现用DELETE删除掉的数据,无法将EXTENT回收,因为deallocate是回收高水位线以上的内容,而不是回收高水位线一下的空块,下面会提及什么是高水位线,TRUNCATE、DROP、SHRINK SPACE的区别所在。
这里用SHRINK SPACE做一个操作,其余的TRUNCATE和DROP就不用多说了:
SQL> alter table aaa enable row movement;
表已更改。
SQL> alter table aaa shrink space;
表已更改。
SQL> alter table aaa disable row movement;
表已更改。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='AAA';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1049 8
通过SHRINK SPACE后,变成了8个块了。
5、高水位线介绍
1、全表扫描的终点 从第一个块到这个块
2、并行插入的起点 大量加载数据,海量数据加载,直接用新块来装,而不是去找空块。/*+append*/
高水位线插入的逻辑图形如下(为什么叫逻辑图形,是因为实际的情况下有还要分块是自动管理的还是人工管理的,在ORACLE 10G的第二个版本自己创建的表空间默认是自动管理的,在块部分会专门介绍):
说明:deallocate是回收高水位线以上的进行回收掉,从上一个试验已经可以查看到了,不过为了专门说明这个,来做一个新的实验:
SQL> create table t1 as select * from emp where 1=2;
表已创建。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='T1';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1057 8
SQL> INSERT INTO t1 select * from emp;
已创建14行。
SQL> INSERT INTO t1 select * from t1;
已创建14行。
SQL> /
已创建28行。
SQL> /
已创建56行。
SQL> /
已创建112行。
SQL> /
已创建224行。
SQL> /
已创建448行。
SQL> /
已创建896行。
SQL> /
已创建1792行。
SQL> commit;
提交完成。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='T1';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1057 8
1 4 57 8
2 6 1065 8
3 4 633 8
SQL> DELETE FROM T1;
已删除3584行。
SQL> commit;
提交完成。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='T1';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1057 8
1 4 57 8
2 6 1065 8
3 4 633 8
SQL> alter table t1 deallocate unused;
表已更改。
SQL> SELECT extent_ID,FILE_ID,BLOCK_ID,BLOCKS
2 FROM dba_extents
3 WHERE owner='SCOTT'
4 AND SEGMENT_NAME='T1';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 6 1057 8
1 4 57 8
2 6 1065 8
3 4 633 8
最后更新:2017-04-02 06:51:22
要回收这部分空间该如何操作呢?压缩,将表的空块进行压缩:< 上一篇:
SQL合并多表查询记录的存储过程
下一篇:
fedora10 samba 配置 windows 访问linux