|
表空间管理主要就是回答两个问题:
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_NAME | EXTENT_MANAGEMENT | SEGMENT_SPACE_MANAGEMENT | 1 | SYSTEM | LOCAL | MANUAL | 2 | SYSAUX | LOCAL | AUTO | 3 | UNDOTBS1 | LOCAL | MANUAL | 4 | TEMP | LOCAL | MANUAL | 5 | USERS | LOCAL | AUTO | 6 | EXAMPLE | LOCAL | AUTO | 7 | SSMM | LOCAL | MANUAL |
- create table hr.ssmm ( a number )
- tablespace ssmm;
-
- create table hr.ssma ( a number )
- tablespace users;
-
- select t.table_name,t.pct_free,t.pct_used,t.pct_increase
- from dba_tables t
- where t.owner='HR' and t.table_name in ('SSMM','SSMA');
复制代码
| TABLE_NAME | PCT_FREE | PCT_USED | PCT_INCREASE | 1 | SSMM | 10 | 40 | | 2 | SSMA | 10 | | |
对照观察一下dba_indexes:
- [oracle@station90 ~]$ 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;
-
- select i.index_name,i.pct_free,i.freelists,i.tablespace_name
- from dba_indexes i
- where i.owner='HR' and i.table_name in ('SSMM','SSMA');
复制代码 | INDEX_NAME | PCT_FREE | FREELISTS | TABLESPACE_NAME | 1 | I_SSMA | 10 | | USERS | 2 | I_SSMM | 10 | | SSMM |
还有因为索引块的行密度更大,所以遇到事务的几率就大,进而要准备更多的事务槽:
- select t.table_name,t.ini_trans
- from dba_tables t
- where t.owner='HR' and t.table_name in ('SSMM','SSMA');
复制代码 | TABLE_NAME | INI_TRANS | 1 | SSMM | 1 | 2 | SSMA | 1 |
- select i.index_name,i.ini_trans
- from dba_indexes i
- where i.owner='HR' and i.table_name in ('SSMM','SSMA');
复制代码 | INDEX_NAME | INI_TRANS | 1 | I_SSMA | 2 | 2 | I_SSMM | 2 |
可以自由定义:
- 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_NAME | PCT_FREE | PCT_USED | INI_TRANS | 1 | T05207_A | 80 | 20 | 5 |
其他的内容:
- 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 tbsuniform datafile '/u01/app/oracle/oradata/orcl/tbsuniform01.dbf'
- size 10M autoextend on uniform size 512K;
-
-
- create table hr.t05207_b ( a number ) storage ( initial 10M );
-
- select * from dba_extents e
- where e.owner='HR' and e.segment_name='T05207_B';
-
- insert into hr.t05207_b values ( 1 ) ;
-
- rollback;
-
- select * from dba_extents e
- where e.owner='HR' and e.segment_name='T05207_B';
复制代码 | OWNER | SEGMENT_NAME | PARTITION_NAME | SEGMENT_TYPE | TABLESPACE_NAME | EXTENT_ID | FILE_ID | BLOCK_ID | BYTES | BLOCKS | RELATIVE_FNO | 1 | HR | T05207_B | | TABLE | USERS | 0 | 6 | 256 | 8388608 | 1024 | 6 | 2 | HR | T05207_B | | TABLE | USERS | 1 | 6 | 1280 | 1048576 | 128 | 6 | 3 | HR | T05207_B | | TABLE | USERS | 2 | 6 | 1408 | 1048576 | 128 | 6 |
permentent表空间看用量:
- select sum(bytes)/1024/1024
- from dba_data_files df where df.tablespace_name='SYSTEM';
-
- select sum(bytes)/1024/1024
- from dba_free_space fs where fs.tablespace_name='SYSTEM';
复制代码 undo表空间看用量:
- select sum(bytes)/1024/1024
- from dba_data_files df where df.tablespace_name='UNDOTBS1';
-
- select sum(bytes)/1024/1024
- from dba_undo_extents ue 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;
复制代码
|
|