阅读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