botang 发表于 2018-7-14 17:00:24

表空间管理




表空间管理主要就是回答两个问题:
1. 区怎么分配
2. 段内部哪些块算空块

Oracle 8以前:
问题1通过freelist来实现,数据文件头上放置第一个freelist指针,指向下一个未分配的区,该区头有第二个指针指向再下一个未分配的区。形成的整个链表反映成dba_extents和dba_free_space视图。
问题2也通过freelist来实现,段头块(一般是该段的第3个块)放置第一个freelist指针,指向下一个“空块”(靠pct_used来判断,低于pct_used标准的块算空块),该“空块”头有第二个指针指向再下一个“空块”。在堆表插入过程中,只有“空块”能被插入。

Oracle 8i到Oracle 9.2.03:
问题1通过bitmap来实现,数据文件头上放置一个bitmap,每一个bit代表一个未分配的区,整个bitmap表反映成dba_extents和dba_free_space视图,可以实现该数据文件上的区分配“自治”,叫做本地管理的表空间。
问题2默认仍旧通过freelist来实现,段头块(一般是该段的第3个块)放置第一个freelist指针,指向下一个“空块”(靠pct_used来判断,低于pct_used标准的块算空块),该“空块”头有第二个指针指向再下一个“空块”。在堆表插入过程中,只有“空块”能被插入。

Oracle 9.2.0.3以后:
问题1通过bitmap来实现,数据文件头上放置一个bitmap,每一个bit代表一个未分配的区,整个bitmap表反映成dba_extents和dba_free_space视图,可以实现该数据文件上的区分配“自治”,叫做本地管理的表空间。
问题2默认通过bitmap来实现,段头块(一般是该段的第3个块)放置一个bitmap,每4个bit代表一个块的空满状态(不靠pct_used来判断,0000/0001/00010/0011这类的会算空块)。在堆表插入过程中,只有“空块”能被插入。这种方法被称为segment space management auto(区别于之前的segment space management manual),解决了批量操作的buffer_busy_wait。



--------------------------------------------------------举例说明:
1. 故意创建一个Oracle 8i到Oracle 9.2.03的表空间:



   TABLESPACE_NAMEEXTENT_MANAGEMENTSEGMENT_SPACE_MANAGEMENT
1SYSTEMLOCALMANUAL
2SYSAUXLOCALAUTO
3UNDOTBS1LOCALMANUAL
4TEMPLOCALMANUAL
5USERSLOCALAUTO
6EXAMPLELOCALAUTO
7SSMMLOCALMANUAL

create table hr.ssmm ( a number )
tablespace ssmm;

create table hr.ssma ( a number )
tablespace users;

selectt.table_name,t.pct_free,t.pct_used,t.pct_increase
from dba_tables t
where t.owner='HR' and t.table_namein ('SSMM','SSMA');

   TABLE_NAMEPCT_FREEPCT_USEDPCT_INCREASE
1SSMM1040
2SSMA10

对照观察一下dba_indexes:
$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Sat Jul 14 17:17:02 2018

Copyright (c) 1982, 2014, Oracle.All rights reserved.

SQL> conn / as sysdba
Connected.
SQL> desc dba_indexes
Name                                           Null?    Type
----------------------------------------- -------- ----------------------------
OWNER                                           NOT NULL VARCHAR2(128)
INDEX_NAME                                 NOT NULL VARCHAR2(128)
INDEX_TYPE                                          VARCHAR2(27)
TABLE_OWNER                                 NOT NULL VARCHAR2(128)
TABLE_NAME                                 NOT NULL VARCHAR2(128)
TABLE_TYPE                                          VARCHAR2(11)
UNIQUENESS                                          VARCHAR2(9)
COMPRESSION                                          VARCHAR2(13)
PREFIX_LENGTH                                          NUMBER
TABLESPACE_NAME                                    VARCHAR2(30)
INI_TRANS                                          NUMBER
MAX_TRANS                                          NUMBER
INITIAL_EXTENT                                     NUMBER
NEXT_EXTENT                                          NUMBER
MIN_EXTENTS                                          NUMBER
MAX_EXTENTS                                          NUMBER
PCT_INCREASE                                          NUMBER
PCT_THRESHOLD                                          NUMBER
INCLUDE_COLUMN                                     NUMBER
FREELISTS                                          NUMBER
FREELIST_GROUPS                                    NUMBER
PCT_FREE                                          NUMBER
LOGGING                                          VARCHAR2(3)
BLEVEL                                             NUMBER
LEAF_BLOCKS                                          NUMBER
DISTINCT_KEYS                                          NUMBER
AVG_LEAF_BLOCKS_PER_KEY                            NUMBER
AVG_DATA_BLOCKS_PER_KEY                            NUMBER
CLUSTERING_FACTOR                                    NUMBER
STATUS                                             VARCHAR2(8)
NUM_ROWS                                          NUMBER
SAMPLE_SIZE                                          NUMBER
LAST_ANALYZED                                          DATE
DEGREE                                             VARCHAR2(40)
INSTANCES                                          VARCHAR2(40)
PARTITIONED                                          VARCHAR2(3)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
BUFFER_POOL                                          VARCHAR2(7)
FLASH_CACHE                                          VARCHAR2(7)
CELL_FLASH_CACHE                                    VARCHAR2(7)
USER_STATS                                          VARCHAR2(3)
DURATION                                          VARCHAR2(15)
PCT_DIRECT_ACCESS                                    NUMBER
ITYP_OWNER                                          VARCHAR2(128)
ITYP_NAME                                          VARCHAR2(128)
PARAMETERS                                          VARCHAR2(1000)
GLOBAL_STATS                                          VARCHAR2(3)
DOMIDX_STATUS                                          VARCHAR2(12)
DOMIDX_OPSTATUS                                    VARCHAR2(6)
FUNCIDX_STATUS                                     VARCHAR2(8)
JOIN_INDEX                                          VARCHAR2(3)
IOT_REDUNDANT_PKEY_ELIM                            VARCHAR2(3)
DROPPED                                          VARCHAR2(3)
VISIBILITY                                          VARCHAR2(9)
DOMIDX_MANAGEMENT                                    VARCHAR2(14)
SEGMENT_CREATED                                    VARCHAR2(3)
ORPHANED_ENTRIES                                    VARCHAR2(3)
INDEXING                                          VARCHAR2(7)

SQL>
会发现dba_indexes里头,怎么没有pct_used,却有pct_free,这是因为对索引而言,值一定要按照顺序插入,不存在不让插入的问题,所以索引是不可能有pct_used。

create index hr.i_ssmm on hr.ssmm(a)
tablespace ssmm;

create index hr.i_ssma on hr.ssma(a)
tablespace users;

selecti.index_name,i.pct_free,i.freelists,i.tablespace_name
   from dba_indexes i
   where i.owner='HR' and i.table_namein ('SSMM','SSMA');
   INDEX_NAMEPCT_FREEFREELISTSTABLESPACE_NAME
1I_SSMA10 USERS
2I_SSMM10 SSMM

还有因为索引块的行密度更大,所以遇到事务的几率就大,进而要准备更多的事务槽:
selectt.table_name,t.ini_trans
from dba_tables t
where t.owner='HR' and t.table_namein ('SSMM','SSMA');
   TABLE_NAMEINI_TRANS
1SSMM1
2SSMA1

   selecti.index_name,i.ini_trans
   from dba_indexes i
   where i.owner='HR' and i.table_namein ('SSMM','SSMA');
   INDEX_NAMEINI_TRANS
1I_SSMA2
2I_SSMM2

可以自由定义:
create table hr.t05207_a ( a number )
pctfree 80 pctused 20 initrans 5 tablespace ssmm;

select t.table_name, t.pct_free, t.pct_used ,t.ini_trans
from dba_tables t
where t.owner='HR' and t.table_name='T05207_A';
   TABLE_NAMEPCT_FREEPCT_USEDINI_TRANS
1T05207_A80205

其他的内容:
select t.tablespace_name,t.allocation_type
from dba_tablespaces t;

select* from dba_extents e
where e.owner='HR' and e.segment_name='T04209_UNAME';

drop table hr.t04209_uname purge;

create tablespace tbsuniformdatafile '/u01/app/oracle/oradata/orcl/tbsuniform01.dbf'
size 10M autoextend on   uniform size 512K;


create table hr.t05207_b ( anumber )storage ( initial 10M );

   select* from dba_extents e
where e.owner='HR' and e.segment_name='T05207_B';

insert intohr.t05207_b values ( 1 ) ;

rollback;

    select* from dba_extents e
where e.owner='HR' and e.segment_name='T05207_B';
   OWNERSEGMENT_NAMEPARTITION_NAMESEGMENT_TYPETABLESPACE_NAMEEXTENT_IDFILE_IDBLOCK_IDBYTESBLOCKSRELATIVE_FNO
1HRT05207_B TABLEUSERS06256838860810246
2HRT05207_B TABLEUSERS16128010485761286
3HRT05207_B TABLEUSERS26140810485761286

permentent表空间看用量:
selectsum(bytes)/1024/1024
from dba_data_files df where df.tablespace_name='SYSTEM';

selectsum(bytes)/1024/1024
from dba_free_space fs where fs.tablespace_name='SYSTEM';undo表空间看用量:
selectsum(bytes)/1024/1024
from dba_data_files df where df.tablespace_name='UNDOTBS1';

selectsum(bytes)/1024/1024
from dba_undo_extentsue where ue.status<>'EXPIRED' ;临时表空间看用量:
select sum(bytes)/1024/1024
from dba_temp_files df where df.tablespace_name='TEMP';

select (t.bytes_cached+t.bytes_used)/1024/1024 from V$TEMP_EXTENT_POOL t;

select t.bytes_cached/1024/1024 from V$TEMP_EXTENT_POOL t;
select sum(t.bytes)/1024/1024 from V$TEMP_EXTENT_MAP t;

select t.bytes_used/1024/1024 from V$TEMP_EXTENT_POOL t;
   T.BYTES_USED/1024/1024
11





页: [1]
查看完整版本: 表空间管理