閱讀469 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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                        PERMANEN
T

 

其中:

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

  上一篇:go SQL合並多表查詢記錄的存儲過程
  下一篇:go fedora10 samba 配置 windows 訪問linux