session
v$session
alter system kill session '158, 173';**关闭某个或者多个会话(158和173是SID)
transaction
v$transaction
记录了当前每个活动事务(也就是还没有提交或者回滚的事务)的信息。其中比较重要的字段包括XIDUSN表示当前事务使用的回滚段的编号、XIDSLOT说明该事务在回滚段头部的事务表中对应的记录编号(也可以叫做槽号)、XIDSQN说明序列号、STATUS说明该事务是否为活动的。
自主(原子)事务
1. 块 block(分成3个部分,上面是header,下面是rowdata,中间是free data)
BLOCK是ORACLE下I/O的最小单位(换句话说,一次读出的数据至少是一个BLOCk)。
ORACLE的BLOCk是由一个或多个OS BLOCk组成的。
ORACLE的BLOCK是在创建TABLESPACE的时候就划分好的,之后分配使用。
ORACLE的初始化参数DB_BLOCK_SIZE就是指定BLOCK大小的。
Header (Common and Variable)
The header contains general block information, such as the block address and the type of segment (for example, data or index).
Table Directory
This portion of the data block contains information about the table having rows in this block.
Row Directory
This portion of the data block contains information about the actual rows in the block (including addresses for each row piece in the row data area).this space is not reclaimed when the row is deleted.
Overhead
The data block header, table directory, and row directory are referred to collectively as overhead. Some block overhead is fixed in size; the total block overhead size is variable. On average, the fixed and variable portions of data block overhead total 84 to 107 bytes.
Row Data
This portion of the data block contains table or index data. Rows can span blocks.
Free Space
Free space is allocated for insertion of new rows and for updates to rows that require additional space (for example, when a trailing null is updated to a nonnull value).
BLOCK的结构: HEADER, FREE SPACE , DATA SPACE。
HEADER部分和DATA SPACE从BLOCK的两头向中间扩展,中间未用的部分就是FREE SPACE。
有4个参数控制着BLOCK的分配:INITTRANS, MAXTRANS, PCTFREE, PCTUSED。
描述如下:BLOCK下包含数据允许最大的操作事务个数取决于
BLOCK某种空间(TRANSACTION SLOT)的分配。
允许的事务越多,需要分配越多的TRANS SLOT。
INITTRANS和MAXTRANS就是规定这个TRANSACTION SLOT的。
PCTFREE和PCTUSED是规定DATA SPACE和FREE SPACE之间关系的:
当一个空的BLOCK开始写入数据后,DATA SPACE部分越来越大,
同时,FREE SPACE越来越小。当数据写入到一定程度时,
FREE SPACE占全部空间等于PCTFREE时,这个BLOCK就不能再写入新的记录了。
剩下的这部分(PCTFREE*DB_BLOCK_SIZE)空间用于给现有
记录update使用。后续的insert会导致从FREE BLOCK列表中拿另外一个BLOCK完成。
当BLOCK中记录通过delete时,BLOCK的DATA SPACE逐渐减少。
如果BLOCK此时是一个FULL BLOCK,
如果DATA SPACE降低至DB_BLOCK_SIZE*PCTUSED后,
ORACLE就认为这个BLOCK是个FREE的BLOCK,就会放入FREE LIST
,可以继续插入数据了。可见,PCTFREE和PCTUSED是两个水位线,
用来限制FREE、USED两个空间分隔线的位置的。
有两种BLOCK的空间管理模式:AUTO和MANUAL。
使用前者,ORACEL会自动管理INITTRANS, MAXTRANS, PCTFREE, PCTUSED
这几个参数。
如下是创建一个AUTO管理的TABLESPACE:
CREATE TABLESPACE data02
DATAFILE '/u01/oradata/data02.dbf' SIZE 5M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO;
区 extent
EXTENTS是若干连续的BLOCKS,ORACLE每次给SEGMENT扩空间的时候,
是以EXTENT为单位的。
在建TABLE/INDEX时几个参数决定了EXTENT的分配特性:
INITIAL EXTENT(单位:K)、NEXT EXTENT(单位:K)、PCT INCREASE(按百分比递增)、MIN EXTENTS(单位:个)、MAX EXTENTS(单位:个)。
基本过程是这样:当SEGMENT创建时,分配的第一个EXTENT大小为INITIAL EXTENT参数指定的大小。
如果SEGMENT的空间不够,会分配第2个、第3个...EXTENT。
第2个EXTENT的大小为NEXT EXTENT,
第3个的大小为NEXT EXTENT*(1+PCT INCREASE),
每次增加PCT INCREASE,以此类推。
每个TABLESPACE都有一个FREE EXTENTS LIST。
当需要新的EXTENTS时,ORACLE会从这个LIST中取一个FREE EXTENT分配
给需要的SEGMENT。
当SEGMENT释放空间时,空闲的EXTENTS会加入到这个LIST中以便后续使用。
段 segment
CREATE TABLE/INDEX
的STORAGE字句,用来指定存储特性。如果没有指定,
按照TABLESPACE的STORAGE属性来,如
果TABLESPACE也没有指定STORAGE属性,则按照ORACLE的默认值来。
通常,一个TABLE对应一个SEGMENT(PARTITION的除外)。
一个SEGMENT只能在一个TABLESPACE内部。
对于PARTITIONED表每个PARTITION占一个SEGMENT,
每个SEGMENT可以在不同的TABLESPACE中。
2. 区 段
Types of Segments
data segment:数据段
index segment:索引段
temporary segment:临时段
undo segment:回退段(ORACLE自动分配)
tbs管理技术
DMT: dictionary managed tablespace,主要问题:对数据字典的争用,空间碎片(找不到一块够用的连续区域)
LMT: local managed tablespace,在每个数据文件的头部加入了一个位图区域,记录每个extent的使用情况
uet$: used extents
fet$: free extents
tbs--extents: DMT(uet$,fet$), LMT(自动分配(递增),统一尺寸)
段空间管理技术
MSSM: manual segment space management,在段头分配freelist来管理block的使用
ASSM: auto segment space management,freelist被位图数组取代,
每个块根据剩余空间可能有的状态:>75%,50-75%,25-50%,<25%,可有效减轻buffer busy wait,
显著提高DML并发操作的性能
segment--blocks: MSSM, ASSM
----------------
DMT
LMT
ASSM 自动段空间管理 表空间级别的段空间管理
segment space management auto添加到本地管理表空间
tbs管理技术
tbs--extents: DMT(uet$,fet$), LMT(自动分配(递增),统一尺寸)
DMT: dictionary managed tablespace,主要问题:对数据字典的争用,空间碎片(找不到一块够用的连续区域)
uet$: used extents
fet$: free extents
"extent management dictionary"
10gR2不支持
LMT: local managed tablespace,在每个数据文件的头部加入了一个位图区域,记录每个extent的使用情况
如果db_block_size<=16KB,数据文件头是64KB保留空间
如果db_block_size=32KB,数据文件头是128KB保留空间
以默认的8KB块举例,就是8个块用在数据文件头部用于记录信息,其中1-2块是文件头信息,3-8块记录区的位图信息
AUTOALLOCATE(system-managed):you can specify the size of the initial extent and Oracle determines
the optimal size of additional extents, with a minimum extent size of 64 KB.
This is the default for permanent tablespaces.
"extent management local [autoallocate]"
UNIFORM SIZE:you can specify an extent size or use the default size, which is 1 MB.
Temporary tablespaces that manage their extents locally can only use this type of allocation.
"extent management local uniform size 2m "
temp tablespace是uniform
segment管理技术
MSSM: manual segment space management,在段头分配freelist来管理block的使用
"segment space management manual "
system,undotbs1,temp:segment space management: manual
ASSM: auto segment space management,自Oracle920出现
freelist被位图数组取代,一个二进制数组
freelist是free blocks的链表,位于段头的块中
每个块根据剩余空间可能有的状态:>75%,50-75%,25-50%,<25%,
位图采用了4个状态来代替以前的pctused,什么时候使用该块由pctfree决定
位图数组是个树形结构
消除寻找剩余空间的串行化,使之并行执行
可有效减轻buffer busy wait,
显著提高DML并发操作的性能
PCTUSED,FREELISTS, and FREELIST GROUPS storage parameters are ignored
"segment space management auto "
BMB: BitMap Block
不能对temp表空间使用ASSM
LOB对象不能在ASSM表空间中创建
segment--blocks: MSSM, ASSM
ASSM必须和LMT结合
sysaux表空间自10g被引入
表空间的使用情况
dba_free_space 查询这个视图可以知道空闲表空间的使用情况(select * from dba_free_space)
段空间的使用情况
dba_segments 查询这个视图可以知道段空间的使用情况(select * from dba_segments)
存储参数:
default storage ( --create tablespace是default storage,create table是storage
initial 1m
next 2m
minextents 1
maxextents unlimited
pctincrease 10
--freelists 2 --create tablespace无这3个参数,create table有这3个参数
--freelist groups 2
--buffer_pool default) -- 区的存储参数
pctfree 20
pctused 60
initrans 5
maxtrans 255 -- 块的存储参数
在生成段的时候,会同时分配初始区(initial extents),
初始区的第一个块就格式化为segment header,
并被用来记录free list描述信息、extents信息,HWM信息等。
free list是一种单向链表用于定位可以接收数据的块,
在字典管理方式的表空间中,Oracle使用free list来管理未分配
的存储块。
Oracle记录了有空闲空间的块用于insert或Update。
scott:
SQL> set long 2000
SQL> select dbms_metadata.get_ddl('TABLE','TEST') from dual;
create table "scott"."test"
( "id" number,
"name" varchar2(30)
) pctfree 10 pctused 40 initrans 1 maxtrans 255
nocompress logging
storage(initial 65536 next 1048576 minextents 1
maxextents 2147483645
pctincrease 0 freelists 1 freelist groups 1
buffer_pool default)
tablespace "users"
创建表空间: create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 1m
autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 1m
autoextend on next 5m maxsize unlimited --对每一个文件
logging
extent management dictionary
--extent management local
--extent management local uniform size 2m
segment space management manual
--segment space management auto
;
drop tablespace test including contents and datafiles;这句话的意思是删除表空间,包括它里面的组成及其数据文件
10gR2
创建表空间时,不能指定区的存储参数和块的存储参数
创建表时,可指定和表空间不同的
(1) tbs: 字典 segment: 手动
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 1m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 1m autoextend on next 5m maxsize unlimited
logging
extent management dictionary
--extent management local
--extent management local uniform size 2m
segment space management manual
--segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
-- pctfree 20
-- pctused 60
-- initrans 5
-- maxtrans 255 -- 块的存储参数
;
不能创建DMT的表空间
(2)LMT,区分配:自动,段空间管理:手动
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 1m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 1m autoextend on next 5m maxsize unlimited
logging
extent management local
--extent management local uniform size 2m
segment space management manual
--segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 64K
minextents 1
maxextents unlimited
drop tablespace test including contents and datafiles;
(3)LMT,区分配:统一大小,段空间管理:手动
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 3m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 3m autoextend on next 5m maxsize unlimited
logging
--extent management local
extent management local uniform size 2m
segment space management manual
--segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 2M
next extent: 2M
minextents 1
maxextents unlimited
drop tablespace test including contents and datafiles;
(4)LMT,区分配:自动,段空间管理:自动
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 1m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 1m autoextend on next 5m maxsize unlimited
logging
extent management local
--extent management local uniform size 2m
--segment space management manual
segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 64K
minextents 1
maxextents unlimited
next 1048576
pctincrease 0
drop tablespace test including contents and datafiles;
(5)LMT,区分配:统一大小,段空间管理:自动
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 3m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 3m autoextend on next 5m maxsize unlimited
logging
--extent management local
extent management local uniform size 2m
--segment space management manual
segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 2M
next extent: 2M
pctincrease 0
minextents 1
maxextents unlimited
drop tablespace test including contents and datafiles;
(6)LMT,区分配:统一大小
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 3m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 3m autoextend on next 5m maxsize unlimited
logging
--extent management local
extent management local uniform size 2m
--segment space management manual
--segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 2M
next extent: 2M
pctincrease 0
minextents 1
maxextents unlimited
segment space management: auto
drop tablespace test including contents and datafiles;
(7)LMT
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 1m ,
'/opt/oracle/oradata/lh/test02.dbf' size 1m
--logging
--extent management local
--extent management local uniform size 2m
--segment space management manual
--segment space management auto
--default storage (
-- initial 1m
-- next 2m
-- minextents 1
-- maxextents unlimited
-- pctincrease 10
-- ) -- 区的存储参数
--pctfree 20
--pctused 60
--initrans 5
--maxtrans 255 -- 块的存储参数
;
不能指定区的存储参数和块的存储参数
initial extent: 64K
next extent: 1M
pctincrease: 0
minextents 1
maxextents : unlimited
extent management: local
allcation type: system
segment space management: auto
logging: logging (temp:nologging)
force logging: no
datafile autoextend: no
datafile maxsize: 0
increment_by: 0
drop tablespace test including contents and datafiles;
(8)
create tablespace test
datafile '/opt/oracle/oradata/lh/test01.dbf' size 3m autoextend on next 5m maxsize unlimited,
'/opt/oracle/oradata/lh/test02.dbf' size 3m autoextend on next 5m maxsize unlimited
extent management local
segment space management auto;
*********如果不写next 5m,每次只会增加1个block,如果写上就会按5M增加
scott:
create table t1(id number) tablespace test;
set long 2000
select dbms_metadata.get_ddl('TABLE','TEST') from dual;
create table "scott"."test"
( "id" varchar2(10),
"name" varchar2(30),
primary key ("id")
using index pctfree 10 initrans 2 maxtrans 255 compute statistics
storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645
pctincrease 0 freelists 1 freelist groups 1 buffer_pool default)
tablespace "users" enable
)
pctfree 10
pctused 40
initrans 1
maxtrans 255
nocompress
logging
storage(
initial 65536
next 1048576
minextents 1
maxextents 2147483645
pctincrease 0
freelists 1
freelist groups 1
buffer_pool default)
tablespace "users"
手动创建表,使用不同于表空间的参数:
create table test2
( "id" varchar2(10),
"name" varchar2(30),
primary key ("id")
)
pctfree 20
pctused 50
initrans 5
maxtrans 255
compress
nologging
storage(
initial 1048576
next 1048576
minextents 2
maxextents 2147483645
pctincrease 10
freelists 1
freelist groups 1
buffer_pool default)
tablespace test;
select dbms_metadata.get_ddl('TABLE','TEST') from dual;
create table "scott"."test2"
( "id" varchar2(10),
"name" varchar2(30),
primary key ("id")
using index pctfree 10 initrans 2 maxtrans 255 nologging
storage(initial 65536 next 1048576 minextents 1 maxextents 2147483645
pctincrease 0 freelists 1 freelist groups 1 buffer_pool default)
tablespace "test" enable
)
pctfree 20
pctused 50
initrans 5
maxtrans 255
compress
nologging
storage(
initial 2097152
next 1048576
minextents 1
maxextents 2147483645
pctincrease 0
freelists 1
freelist groups 1
buffer_pool default)
tablespace "test"
drop tablespace test including contents and datafiles;
drop tablespace test including contents and datafiles;
修改数据文件的属性:
alter database datafile '/opt/oracle/oradata/lh/tbs101.dbf' autoextend on next 5m maxsize unlimited;
alter system set db_create_file_dest = '$ORACLE_BASE/oradata/lh'; 修改这个参数是为了指定目录,然后创建下面的表空间
create tablespace omf_ts1;
/opt/oracle/oradata/lh/LH/datafile/o1_mf_omf_ts1_5kbrz0dy_.dbf
file size: 104857600
initial extent: 64K
next extent:
minextents 1
maxextents : unlimited
extent management: local
allcation type: system
segment space management: auto
logging: logging
force logging: no
datafile autoextend: yes
datafile maxsize: 34359721984 bytes
increment_by: 12800 blocks 100M
drop tablespace omf_ts1 including contents and datafiles;
------------------------------
区分配: Automatic, Uniform
Segment Space Management: Automatic, Manual
EXTENT MANAGEMENT LOCAL 的两种 Extents 分配方式:
AUTOALLOCATE (system-managed):you can specify the size of the initial extent and Oracle determines
the optimal size of additional extents, with a minimum extent size of 64 KB.
This is the default for permanent tablespaces.
UNIFORM SIZE:you can specify an extent size or
use the default size, which is 1 MB. Temporary
tablespaces that manage their extents locally
can only use this type of allocation.
当使用 Local 管理 Extents 时参数 NEXT, PCTINCREASE,
MINEXTENTS, MAXEXTENTS, and DEFAULT STORAGE 不能使用。
SEGMENT SPACE MANAGEMENT 的两种管理方式:
MANUAL
Specifying MANUAL tells Oracle that you want to use
free lists for managing free space within segments.
Free lists are lists of data blocks that have
space available for inserting rows. This form of
managing space within segments is called manual
segment-space management because of the need to
specify and tune the PCTUSED, FREELISTS,
and FREELISTS GROUPS storage parameters for
schema objects created in the tablespace.
AUTO
This keyword tells Oracle that you want to use bitmaps
to manage the free space within segments. A bitmap,
in this case, is a map that describes the status of
each data block within a segment with respect to
the amount of space in the block available for inserting
rows. As more or less space becomes available in a data
block, its new state is reflected in the bitmap.
Bitmaps allow Oracle to manage free space more
automatically, and thus, this form of space management
is called automatic segment-space management.It completely
eliminates any need to specify and tune the PCTUSED,
FREELISTS, and FREELISTS GROUPS storage parameters for
schema objects created in the tablespace. If such
attributes should be specified, they are ignored.
区管理:本地管理
区分配:自动,段空间管理:自动
create tablespace "tbs"
datafile '/opt/oracle/oradata/lh/tbs01.dbf'
size 5m
autoextend on next 1m maxsize unlimited logging
extent management local
segment space management auto
区分配:统一大小,段空间管理:自动
create smallfile tablespace "tbs"
datafile '/opt/oracle/oradata/lh/tbs01.dbf' size 5m
autoextend on next 1m maxsize unlimited logging
extent management local uniform size 1m
segment space management auto
区分配:自动,段空间管理:手动
create smallfile tablespace "tbs"
datafile '/opt/oracle/oradata/lh/tbs01.dbf' size 5m
autoextend on next 1m maxsize unlimited logging
extent management local
segment space management manual
区分配:统一大小,段空间管理:手动
create smallfile tablespace "tbs"
datafile '/opt/oracle/oradata/lh/tbs01.dbf' size 5m
autoextend on next 1m maxsize unlimited logging
extent management local uniform size 1m
segment space management manual
区管理:字典管理 uet$ fet$ 10gR2不能创建DMT的表空间
create smallfile tablespace "tbs"
datafile '/opt/oracle/oradata/lh/tbs01.dbf' size 5m
autoextend on next 1m maxsize unlimited logging
extent management dictionary
default storage ( initial 1m next 2m
minextents 1 maxextents unlimited pctincrease 10)
minimum extent 1m
在生成段的时候,会同时分配初始区(initial extents),
初始区的第一个块就格式化为segment header,
并被用来记录free list描述信息、extents信息,HWM信息等。
free list是一种单向链表用于定位可以接收数据的块,
在字典管理方式的表空间中,Oracle使用free list来管理未分配
的存储块。
Oracle记录了有空闲空间的块用于insert或Update。
scott:
SQL> set long 2000
SQL> select dbms_metadata.get_ddl('TABLE','TEST') from dual;
CREATE TABLE "SCOTT"."TEST"
( "ID" NUMBER,
"NAME" VARCHAR2(30)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
CREATE TABLE "SCOTT"."TEST2"
( "ID" NUMBER,
"NAME" VARCHAR2(30)
) PCTFREE 0 PCTUSED 60 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
Row Chaining(行链接)和 Row Migrating(行迁移)
Row Chaining: insert
the row is too large to fit into one data block
when it is first inserted. In this case, Oracle stores
the data for the row in a chain of data blocks (one or more)
reserved for that segment. Row chaining most often occurs with
large rows, such as rows that contain a column of datatype
LONG or LONG RAW. Row chaining in these cases is unavoidable.
Row Migrating: update
a row that originally fit into one data block is updated so
that the overall row length increases, and the block's free
space is already completely filled. In this case, Oracle migrates
the data for the entire row to a new data block, assuming the
entire row can fit in a new block. Oracle preserves the original
row piece of a migrated row to point to the new block containing
the migrated row. The rowid of a migrated row does not change.