@H_502_3@
6.读书笔记收获不止Oracle之 逻辑体系@H_502_3@
逻辑体系正是从体系物理结构图中的数据文件部分展开描述的。@H_502_3@
逻辑结构有:表空间,段,区,块。@H_502_3@
如下图1所示:@H_502_3@
一系列连续的BLOCK组成了EXTENT,一个或多个EXTENT组成了SEGMENT,一个或多个SEGMENT组成了TABLESPACE,一个或抖个TABLESPACE组成了DATABASE。@H_502_3@
表就是从数据文件里直观抽象出来的逻辑结构。@H_502_3@
表对应表段,注意表并不是只是对应一个段,如果表中包含LOB类型列,则LOB至少会有两个段,数据段和索引段。@H_502_3@
假设一个区固定是 由10个数据块组成的,那么插入T表的动作就是这样:@H_502_3@
数据插入某个区的的第一个数据块,然后插入第二个同属于这个区的连续数据块,然后第三个块…当插入第11个数据块的时候,这个区满了,那么只要插入另一个区中去。@H_502_3@
直接用块组成组成segment怎么样?@H_502_3@
因为块的尺寸太小了,如果以块为单位进行扩展,太频繁了。@H_502_3@
1. block
BLOCK是ORACLE的最小逻辑数据单位,ORACLE总是访问整个ORALCE BLOCK,而不是按照操作系统的block size 来访问的。@H_502_3@
OS的块容量一般是512字节,数据块一般默认设置为8KB。一般是OS块容量的整数倍,这样可以减少IO操作。@H_502_3@
此外,数据库块,额外提供了一定的管理功能。数据库的组成分为数据块头,表目录区,行目录区,可用空间区,行数据区 5个部分。@H_502_3@
如下图2:@H_502_3@
l 数据块头 中包含了此数据块的概要信息,例如块地址及此数据块所属的段的类型@H_502_3@
l 表目录存放,只要有一行数据插入到数据库块中,那该行数据所在的表的信息将被存储在这个区域。@H_502_3@
l 行目录存放 插入的行的地址@H_502_3@
l 可用空间去,是块中的空余空间。空余多少由ORALCE的PCTFREE参数设置@H_502_3@
l 行数据区,存储具体的行的信息或者索引的信息,占用了数据块绝大部分的空间@H_502_3@
数据块头,表目录,行目录称为管理开销。@H_502_3@
2. 区与段
EXTENT区数据扩展 是ORACLE 数据库分配空间的最小单位。@H_502_3@
在ORACLE数据库中,只要段创建成功,数据库一定为其分配了包含若干数据块的初始数据扩展。@H_502_3@
如果区中的数据块都满了,就会分配一个新增的数据扩展区。@H_502_3@
每个段的定义中都包含了数据扩展extent的存储参数。@H_502_3@
在CREATE TABLE语句中使用STORAGE 子句设定存储参数,决定创建表时为其数据段分配多少初始空间,或限定一个表最多可以包含多少数据扩展。没有设定,就使用所在表空间的默认存储参数。@H_502_3@
此外,区的大小也是可以自主选择的。@H_502_3@
在本地管理的表空间中(还有一种数据字典管理的表空间,已淘汰),所分配的数据扩展的容量既可以是用户设定的固定值,也可以是系统自动决定的可变值。取决于用户创建表空间时用UNIFORM指令(固定大小)还是AUTOALLOCATE指令(系统管理)。@H_502_3@
对于固定容量(UNIFORM)的数据扩展,可以为数据扩展设定容量(100MB,1GB等)或默认1MB。扩展的容量至少能包含5个数据块。本地管理的临时表空间,在分配数据扩展时只能试用此种方式。@H_502_3@
对于系统管理(AUTOALLOCATE)数据扩展,我们无从插手干预。获取一个申请20M,下一个申请200M。ORACLE自行决定新增数据扩展的最佳容量。不过也有一个下限的,最小容量不能低于64KB,如果数据块容量大于等于16KB,下限从64KB 变为1MB。@H_502_3@
3. 表空间
包含系统表空间、临时表空间、回滚表空间和数据表空间。@H_502_3@
4. 查看逻辑结构命令
查看block_size@H_502_3@
sql>show parameter db_block_size@H_502_3@
NAME TYPE VALUE@H_502_3@
----------------------------------------------- ------------------------------@H_502_3@
db_block_size integer 8192@H_502_3@
或者@H_502_3@
sql> select block_size fromdba_tablespaces where tablespace_name='SYSTEM';@H_502_3@
4.1创建表空间
sql> create tablespace TBS_TOAD@H_502_3@
datafile '+DATA/ORCL/DATAFILE/TBS_TOAD01.dbf' size 100M extentmanagement local segment space management auto;@H_502_3@
进行查看:@H_502_3@
Col file_name format a50@H_502_3@
Set linesize 366@H_502_3@
sql> Select file_name,tablespace_name,autoextensible,bytesfrom dba_data_files where tablespace_name='TBS_TOAD' order bysubstr(file_name,-12);@H_502_3@
FILE_NAME TABLESPACE_NAME AUT BYTES@H_502_3@
-------------------------------------------------------------------------------- --- ----------@H_502_3@
+DATA/ORCL/DATAFILE/tbs_toad01.dbf TBS_TOAD NO104857600@H_502_3@
4.2临时表空间
sql> create temporary tablespace temp_zou tempfile'+DATA/ORCL/DATAFILE/temp_toad01.dbf' size 100m;@H_502_3@
Tablespace created.@H_502_3@
sql> select file_name,bytes,autoextensible from dba_temp_fileswhere tablespace_name='TEMP_ZOU';@H_502_3@
FILE_NAME BYTESAUT@H_502_3@
------------------------------------------------------------ ---@H_502_3@
+DATA/ORCL/DATAFILE/temp_toad01.dbf 104857600 NO@H_502_3@
4.3回滚段表空间
sql> create undo tablespace undotbs2 datafile'+DATA/ORCL/DATAFILE/undotbs2.dbf' size 100m;@H_502_3@
Tablespace created.@H_502_3@
sql> selectfile_name,bytes/1024/1024 from dba_data_fileswhere tablespace_name='UNDOTBS2' order by substr(file_name,-12);@H_502_3@
FILE_NAME TABLESPACE_NAME AUTBYTES/1024/1024@H_502_3@
-------------------------------------------------------------------------------- --- ---------------@H_502_3@
+DATA/ORCL/DATAFILE/undotbs2.dbf UNDOTBS2 NO 100@H_502_3@
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);@H_502_3@
FILE_NAME AUTOEXTENSIBLE BYTES/1024/1024@H_502_3@
-------------------------------------------------------------------------------- ---------------@H_502_3@
+DATA/ORCL/DATAFILE/sysaux.257.889644591 SYSAUX 630@H_502_3@
+DATA/ORCL/DATAFILE/system.258.889644635 SYSTEM 810@H_502_3@
4.5查看保留内存是否永久
sql> select tablespace_name,contents from dba_tablespaces wheretablespace_name in ('TBS_TOAD','TEMP_ZOU','UNDOTBS2','SYSTEM','SYSAUX');@H_502_3@
TABLESPACE_NAME CONTENTS@H_502_3@
------------------------------ ---------@H_502_3@
SYSTEM PERMANENT@H_502_3@
SYSAUX PERMANENT@H_502_3@
UNDOTBS2 UNDO@H_502_3@
TBS_TOAD PERMANENT@H_502_3@
TEMP_ZOU TEMPORARY@H_502_3@
5. USER示例操作
5.1extent
如果希望指定用户的默认表空间是某指定表空间,那该表空间必须先建立,用户就可以指定默认表空间在该表空间了。@H_502_3@
sql>create user toad identified by toad default tablespacetbs_toad temporary tablespace temp_zou;@H_502_3@
Grant dba to toad;@H_502_3@
Connect toad/toad@H_502_3@
使用user来操作@H_502_3@
sql>create table t (id int) tablespacetbs_toad;@H_502_3@
如果没有指明表空间,就是用户toad默认的表空间。@H_502_3@
sql> select segment_name,extent_id,bytes/1024/1024,blocksfrom user_extents where segment_name='T'; @H_502_3@
现在什么都没有,然后插入数据@H_502_3@
sql> insert into t select rownum fromdual connect by level<=1000000;@H_502_3@
1000000 rows created.@H_502_3@
select segment_name,blocksfrom user_extents where segment_name='T'; @H_502_3@
SEGMENT_NAME EXTENT_ID TABLESPACE_NAME BYTES/1024/1024 BLOCKS@H_502_3@
--------------- ---------------------------------------- --------------- ----------@H_502_3@
T 0 TBS_TOAD .0625 8@H_502_3@
T 1 TBS_TOAD .0625 8@H_502_3@
T 2 TBS_TOAD .0625 8@H_502_3@
T 3 TBS_TOAD .0625 8@H_502_3@
T 4 TBS_TOAD .0625 8@H_502_3@
T 5 TBS_TOAD .0625 8@H_502_3@
T 6 TBS_TOAD .0625 8@H_502_3@
T 7 TBS_TOAD .0625 8@H_502_3@
T 8 TBS_TOAD .0625 8@H_502_3@
T 9 TBS_TOAD .0625 8@H_502_3@
T 10TBS_TOAD .0625 8@H_502_3@
SEGMENT_NAME EXTENT_ID TABLESPACE_NAME BYTES/1024/1024 BLOCKS@H_502_3@
--------------- ---------------------------------------- --------------- ----------@H_502_3@
T 11TBS_TOAD .0625 8@H_502_3@
T 12TBS_TOAD .0625 8@H_502_3@
T 13TBS_TOAD .0625 8@H_502_3@
T 14TBS_TOAD .0625 8@H_502_3@
T 15TBS_TOAD .0625 8@H_502_3@
T 16TBS_TOAD 1 128@H_502_3@
T 17TBS_TOAD 1 128@H_502_3@
T 18TBS_TOAD 1 128@H_502_3@
T 19TBS_TOAD 1 128@H_502_3@
T 20TBS_TOAD 1 128@H_502_3@
T 21TBS_TOAD 1 128@H_502_3@
SEGMENT_NAME EXTENT_ID TABLESPACE_NAME BYTES/1024/1024 BLOCKS@H_502_3@
--------------- ---------------------------------------- --------------- ----------@H_502_3@
T 22TBS_TOAD 1 128@H_502_3@
T 23TBS_TOAD 1 128@H_502_3@
T 24TBS_TOAD 1 128@H_502_3@
T 25TBS_TOAD 1 128@H_502_3@
T 26TBS_TOAD 1 128@H_502_3@
T 27TBS_TOAD 1 128@H_502_3@
28 rows selected.@H_502_3@
5.2segment
sql>drop table t purge;@H_502_3@
Create table t (id int) tablespacetbs_toad;@H_502_3@
select segment_name,segment_type,blocks,extents,bytes/1024/1024from user_segments where segment_name='T';@H_502_3@
no rows selected@H_502_3@
插入数据后观察@H_502_3@
sql> insert into t select rownum from dual connect by level<=1000000;@H_502_3@
1000000 rows created.@H_502_3@
sql> select segment_name,bytes/1024/1024from user_segments where segment_name='T';@H_502_3@
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BLOCKS EXTENTSBYTES/1024/1024@H_502_3@
---------------@H_502_3@
TTABLE TBS_TOAD 1664 28 13@H_502_3@
共使用了1664块BLOCK,28个EXTENT,总大小为13M。@H_502_3@
观察索引段@H_502_3@
sql> create index idx_id on t(id);@H_502_3@
col segment_name format a15;@H_502_3@
col tablespace_name format a15;@H_502_3@
sql> selectsegment_name,bytes/1024/1024 fromuser_segments where segment_name='IDX_ID';@H_502_3@
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BLOCKS EXTENTS@H_502_3@
--------------- --------------------------------- ---------- ----------@H_502_3@
BYTES/1024/1024@H_502_3@
---------------@H_502_3@
IDX_ID INDEX TBS_TOAD 2304 33@H_502_3@
18@H_502_3@
共2304个块,33个区,大小为18M。@H_502_3@
这个索引大小比数据段还大其实。@H_502_3@
查看区个数,还可以如下:@H_502_3@
sql> select count(*) from user_extents wheresegment_name='IDX_ID';@H_502_3@
COUNT(*)@H_502_3@
----------@H_502_3@
33@H_502_3@