6.读书笔记收获不止Oracle之 逻辑体系

 

6.读书笔记收获不止Oracle之 逻辑体系

逻辑体系正是从体系物理结构图中的数据文件部分展开描述的。

逻辑结构有:表空间,段,区,块。

如下图1所示:

 

           一系列连续的BLOCK组成了EXTENT,一个或多个EXTENT组成了SEGMENT,一个或多个SEGMENT组成了TABLESPACE,一个或抖个TABLESPACE组成了DATABASE。

           表就是从数据文件里直观抽象出来的逻辑结构。

           表对应表段,注意表并不是只是对应一个段,如果表中包含LOB类型列,则LOB至少会有两个段,数据段和索引段。

           假设一个区固定是 由10个数据块组成的,那么插入T表的动作就是这样:

           数据插入某个区的的第一个数据块,然后插入第二个同属于这个区的连续数据块,然后第三个块…当插入第11个数据块的时候,这个区满了,那么只要插入另一个区中去。

           直接用块组成组成segment怎么样?

           因为块的尺寸太小了,如果以块为单位进行扩展,太频繁了。

 

1.  block

BLOCK是ORACLE的最小逻辑数据单位,ORACLE总是访问整个ORALCE BLOCK,而不是按照操作系统的block size 来访问的。

           OS的块容量一般是512字节,数据块一般默认设置为8KB。一般是OS块容量的整数倍,这样可以减少IO操作。

           此外,数据库块,额外提供了一定的管理功能。数据库的组成分为数据块头,表目录区,行目录区,可用空间区,行数据区 5个部分。

如下图2

l  数据块头 中包含了此数据块的概要信息,例如块地址及此数据块所属的段的类型

l  表目录存放,只要有一行数据插入到数据库块中,那该行数据所在的表的信息将被存储在这个区域。

l  行目录存放 插入的行的地址

l  可用空间去,是块中的空余空间。空余多少由ORALCE的PCTFREE参数设置

l  行数据区,存储具体的行的信息或者索引的信息,占用了数据块绝大部分的空间

数据块头,表目录,行目录称为管理开销。

 

2.  区与段

 EXTENT区数据扩展 是ORACLE 数据库分配空间的最小单位。

 在ORACLE数据库中,只要段创建成功,数据库一定为其分配了包含若干数据块的初始数据扩展。

 如果区中的数据块都满了,就会分配一个新增的数据扩展区。

每个段的定义中都包含了数据扩展extent的存储参数。

           在CREATE TABLE语句中使用STORAGE 子句设定存储参数,决定创建表时为其数据段分配多少初始空间,或限定一个表最多可以包含多少数据扩展。没有设定,就使用所在表空间的默认存储参数。

           此外,区的大小也是可以自主选择的。

           在本地管理的表空间中(还有一种数据字典管理的表空间,已淘汰),所分配的数据扩展的容量既可以是用户设定的固定值,也可以是系统自动决定的可变值。取决于用户创建表空间时用UNIFORM指令(固定大小)还是AUTOALLOCATE指令(系统管理)。

           对于固定容量(UNIFORM)的数据扩展,可以为数据扩展设定容量(100MB,1GB等)或默认1MB。扩展的容量至少能包含5个数据块。本地管理的临时表空间,在分配数据扩展时只能试用此种方式。

           对于系统管理(AUTOALLOCATE)数据扩展,我们无从插手干预。获取一个申请20M,下一个申请200M。ORACLE自行决定新增数据扩展的最佳容量。不过也有一个下限的,最小容量不能低于64KB,如果数据块容量大于等于16KB,下限从64KB 变为1MB。

 

3.  表空间

包含系统表空间、临时表空间、回滚表空间和数据表空间。

 

 

 

4.  查看逻辑结构命令

查看block_size

SQL>show parameter db_block_size

 

NAME                                             TYPE         VALUE

----------------------------------------------- ------------------------------

db_block_size                             integer     8192

或者

SQL> select block_size fromdba_tablespaces where tablespace_name='SYSTEM';

 

4.1      创建表空间

SQL> create tablespace TBS_TOAD

   datafile '+DATA/ORCL/DATAFILE/TBS_TOAD01.dbf' size 100M extentmanagement local segment space management auto;

进行查看:

Col file_name format a50

Set linesize 366

SQL> Select file_name,tablespace_name,autoextensible,bytesfrom dba_data_files where tablespace_name='TBS_TOAD' order bysubstr(file_name,-12);

 

FILE_NAME                                                     TABLESPACE_NAME                 AUT          BYTES

-------------------------------------------------------------------------------- --- ----------

+DATA/ORCL/DATAFILE/tbs_toad01.dbf                TBS_TOAD                         NO  104857600

 

4.2      临时表空间

SQL> create temporary tablespace temp_zou tempfile'+DATA/ORCL/DATAFILE/temp_toad01.dbf' size 100m;

 

Tablespace created.

 

SQL> select file_name ,bytes,autoextensible from dba_temp_fileswhere tablespace_name='TEMP_ZOU';

 

FILE_NAME                                                            BYTESAUT

------------------------------------------------------------ ---

+DATA/ORCL/DATAFILE/temp_toad01.dbf                        104857600 NO

 

4.3      回滚段表空间

 

SQL> create undo tablespace undotbs2 datafile'+DATA/ORCL/DATAFILE/undotbs2.dbf' size 100m;

 

Tablespace created.

 

SQL> selectfile_name,tablespace_name,autoextensible,bytes/1024/1024 from dba_data_fileswhere tablespace_name='UNDOTBS2' order by substr(file_name,-12);

 

FILE_NAME                                                     TABLESPACE_NAME                 AUTBYTES/1024/1024

-------------------------------------------------------------------------------- --- ---------------

+DATA/ORCL/DATAFILE/undotbs2.dbf                     UNDOTBS2                         NO                      100

 

4.4      系统表空间

SQL> select file_name,tablespace_nameautoextensible,bytes/1024/1024 from dba_data_files where tablespace_name like'SYS%' order by substr(file_name,-12);

 

FILE_NAME                                                     AUTOEXTENSIBLE                     BYTES/1024/1024

-------------------------------------------------------------------------------- ---------------

+DATA/ORCL/DATAFILE/sysaux.257.889644591          SYSAUX                                              630

+DATA/ORCL/DATAFILE/system.258.889644635         SYSTEM                                             810

 

4.5      查看保留内存是否永久

SQL> select tablespace_name,contents from dba_tablespaces wheretablespace_name in ('TBS_TOAD','TEMP_ZOU','UNDOTBS2','SYSTEM','SYSAUX');

 

TABLESPACE_NAME                 CONTENTS

------------------------------ ---------

SYSTEM                                PERMANENT

SYSAUX                                 PERMANENT

UNDOTBS2                           UNDO

TBS_TOAD                           PERMANENT

TEMP_ZOU                          TEMPORARY

 

 

5.  USER示例操作

5.1      extent

如果希望指定用户的默认表空间是某指定表空间,那该表空间必须先建立,用户就可以指定默认表空间在该表空间了。

SQL>create user toad identified by toad default tablespacetbs_toad temporary tablespace temp_zou;

Grant dba to toad;

Connect toad/toad

 

使用user来操作

SQL>create table t (id int) tablespacetbs_toad;

如果没有指明表空间,就是用户toad默认的表空间。

SQL> select segment_name,extent_id,tablespace_name,bytes/1024/1024,blocksfrom user_extents where segment_name='T';

现在什么都没有,然后插入数据

SQL> insert into t select rownum fromdual connect by level<=1000000;

 

1000000 rows created.

 

SQL> commit;

select segment_name,extent_id,tablespace_name,bytes/1024/1024,blocksfrom user_extents where segment_name='T';

SEGMENT_NAME      EXTENT_ID TABLESPACE_NAME                   BYTES/1024/1024     BLOCKS

--------------- ---------------------------------------- --------------- ----------

T                             0 TBS_TOAD                                       .0625             8

T                             1 TBS_TOAD                                       .0625             8

T                             2 TBS_TOAD                                       .0625             8

T                             3 TBS_TOAD                                       .0625             8

T                             4 TBS_TOAD                                       .0625             8

T                             5 TBS_TOAD                                       .0625             8

T                             6 TBS_TOAD                                       .0625             8

T                             7 TBS_TOAD                                       .0625             8

T                             8 TBS_TOAD                                       .0625             8

T                             9 TBS_TOAD                                       .0625             8

T                             10TBS_TOAD                                       .0625             8

 

SEGMENT_NAME      EXTENT_ID TABLESPACE_NAME                   BYTES/1024/1024     BLOCKS

--------------- ---------------------------------------- --------------- ----------

T                             11TBS_TOAD                                       .0625            8

T                             12TBS_TOAD                                       .0625             8

T                             13TBS_TOAD                                       .0625             8

T                             14TBS_TOAD                                       .0625             8

T                             15TBS_TOAD                                       .0625             8

T                             16TBS_TOAD                                              1        128

T                             17TBS_TOAD                                              1        128

T                             18TBS_TOAD                                              1        128

T                             19TBS_TOAD                                              1        128

T                             20TBS_TOAD                                              1        128

T                             21TBS_TOAD                                              1        128

 

SEGMENT_NAME      EXTENT_ID TABLESPACE_NAME                   BYTES/1024/1024     BLOCKS

--------------- ---------------------------------------- --------------- ----------

T                             22TBS_TOAD                                              1        128

T                             23TBS_TOAD                                              1        128

T                             24TBS_TOAD                                              1        128

T                             25TBS_TOAD                                              1        128

T                             26TBS_TOAD                                              1        128

T                             27TBS_TOAD                                              1        128

 

28 rows selected.

 

5.2      segment

 

SQl>drop table t purge;

Create table t (id int) tablespacetbs_toad;

select segment_name,segment_type,tablespace_name,blocks,extents,bytes/1024/1024from user_segments where segment_name='T';

 

no rows selected

插入数据后观察

SQL> insert into t select rownum from dual connect by level<=1000000;

1000000 rows created.

SQL> commit;

SQL> select segment_name,segment_type,tablespace_name,blocks,extents,bytes/1024/1024from user_segments where segment_name='T';

 

SEGMENT_NAME  SEGMENT_TYPE TABLESPACE_NAME          BLOCKS      EXTENTSBYTES/1024/1024

---------------

T      TABLE                              TBS_TOAD                    1664 28        13

共使用了1664块BLOCK,28个EXTENT,总大小为13M。

观察索引段

SQL> create index idx_id on t(id);

col segment_name format a15;

col tablespace_name format a15;

SQL> selectsegment_name,segment_type,tablespace_name,blocks,extents,bytes/1024/1024 fromuser_segments where segment_name='IDX_ID';

SEGMENT_NAME      SEGMENT_TYPE            TABLESPACE_NAME     BLOCKS        EXTENTS

--------------- --------------------------------- ---------- ----------

BYTES/1024/1024

---------------

IDX_ID                  INDEX                      TBS_TOAD             2304               33

                18

 

共2304个块,33个区,大小为18M。

这个索引大小比数据段还大其实。

查看区个数,还可以如下:

SQL> select count(*) from user_extents wheresegment_name='IDX_ID';

 

 COUNT(*)

----------

           33

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值