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