表空间管理
表空间管理主要就是回答两个问题:
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]