实验表空间,表 的 storage参数
init:第一个区大小
next:Linit后下个区大小
MINEXTENTS:这是要分配的最小区数。
MAXEXTENTS:这是要分配的最大区数。如果将MINEXTENTS 指定为一个大于1 的值,而表空间包含多个数据文件,则这些区将分布在不同的数据文件中。
PCTINCREASE:这是NEXT 区及以后的区有关区大小增长的百分比
PCTFREE:指定表内每个数据块中空间的百分比。PCTFREE 的值必须介于0 和99
之间。如果值为零,表示可以通过插入新行来填充整个块。缺省值为10。此值表示每
个块中保留着10% 的空间,用于更新现有的行以及插入新行,每个块最多可填充到
90%。
PCTUSED:指定为表内每个数据块维护的已用空间的最小百分比。如果一个块的已用
空间低于PCTUSED,则可在该块中插入行。PCTUSED 的值为介于0 和99 之间的整
数,缺省值为40。(segment management space manual时候 控制块是否在FREELIST上),pctfree加pctused要小于100
总得来说PCTFREE 就是告诉ORACLE 什么时候把BLOCK从FREELIST拿走(自动段空间管理没有FREELIST)拿走后 即使空闲空间>PCTFREE也不会放入FREELIST(使用空间<90%时),只有当使用空间
initans:块中事务槽数量 10G default 2个(表示同时有两个事务可以对这个块修改~~一个块中可以存很多行)
MAXTRANS:最多可以设置多少 缺省值为255 10G 忽略
freelist(freelist groups):如果 segment management space manual空间分配使用都靠freelist(buffer busy waits class# 为4的时候是段头争用 需要加大freelist default
1)当一个insert从freelist中插入一个快时候,此块已经用空间>PCTUSED,oracle把它从freelist中移走, 当delete,update后,oracle检查相关的 块 如果 已用空间
放入freelist中,若当前事务(update,delete释放空间的事务)若该事务还要些入数据 这这个块首先使用,该事务未COMMIT时此块要等 此事务COMMIT后 才能让别的事务使用这个块
的空间,
HWM下的块才出现在FREELIST,如果FREELIST中为空那HWM就向上分配新块 并放入freelist中
***************(选自9I10G 编程艺术)
使用多个freelist时,有一个主freelist,还有 一些进程freelist。如果一个段只有一个freelist,那么主freelist和进程freelist就是这同一个自由列表。如果你有两个
freelist,实际上将有一个主freelist和两个进程freelist。对于一个给定的会话,会根据其会话ID的散列值为之指定一个进程 freelist。目前,每个进程freelist都只有很少的
块,余下的自由块都在主freelist上。使用一个进程freelist时,它会根据需 要从主freelist拉出一些块。如果主freelist无法满足空间需求,Oracle就会推进HWM,并向主
freelist中增加空块。过一段时 间后,主freelist会把其存储空间分配多个进程freelist(再次说明,每个进程freelist都只有为数不多的块)。因此,每个进程会使用 一个进
程freelist。它不会从一个进程freelist到另一个进程freelist上寻找空间。这说明,如果一个表上有10个进程 freelist,而且你的进程所用的进程freelist已经用尽了该列表中
的自由缓冲区,它不会到另一个进程freelist上寻找空间,即使另外9 个进程freelist都分别有5块(总共有45个块),此时它还是会去求助主freelist。假设主freelist上的空间
无法满足这样一个自由块 请求,就会导致表推进HWM,或者如果表的HWM无法推进(所有空间都已用),就要扩展表的空间(得到另一个区段)。然后这个进程仍然只使用其
freelist上的空间(现在不再为空)。使用多个freelist时要有所权衡。一方面,使用多个freelist可以大幅度提升性能。另一方面,有 可能导致表不太必要地使用稍多的磁盘空
间。你必须想清楚在你的环境中哪种做法麻烦比较小。
********************
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.02a.00000b76 0x008007de.032c.2a C--- 0 scn 0x0000.005e656c
0x02 0x0004.026.00000b76 0x008007de.032c.29 C--- 0 scn 0x0000.005e5e41
SQL> desc user_tables;
PCT_FREE~~~~~~~~~~~~~~~~~~存储信息
PCT_USED
INI_TRANS
MAX_TRANS
INITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
FREELISTS
FREELIST_GROUPS
segment management space AUTO时 freelist,freelistgroups ,pctUSED都不管用了因为不使用freelist了,用bitmap表示块状态了,不过pctfree还有作用 还限制新行能否插入一
个块中
*************临时表
SQL> create global temporary table test_temp2 (a int) ON COMMIT PRESERVE ROWS;
Table created.
SQL> insert into test_temp2 values(1);
1 row created.
SQL> select * from test_temp2;
A
----------
1
SQL> commit;~~~~~~~~~~~~~~~~~~~~~~~~~会话期间都存在 即便commit 也还在
~
Commit complete.
SQL> select * from test_temp2;
A
----------
1
SQL> disc
Disconnected from Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Pr
oduction
With the Partitioning, OLAP and Data Mining options
SQL> conn / as sysdba
Connected.
SQL> select * from test_temp2;
no rows selected
**********************************************
SQL> create global temporary table test_temp (a int) ON COMMIT delete ROWS;~~~~~~~~~~~~事务期间存在 事务结束后是删除
Table created.
SQL> insert into test_temp values(1);
1 row created.
SQL> select * from test_temp;
A
----------
1
SQL> commit;
Commit complete.
SQL> select * from test_temp;
no rows selected
**********
SQL> insert into test_temp2 values(1);
1 row created.
SQL> select * from test_temp2;
A
----------
1
SQL> select * from test_temp2;~~~~~~~~另一个会话看不到,只针对当前SESSION
no rows selected
SQL> select blocks,tablespace_name from dba_tables where table_NAME='TEST_TEMP2
';
BLOCKS TABLESPACE_NAME
---------- ------------------------------
~~~~~~~~~~~~~~~~~~~~~
SQL> execute dbms_stats.gather_table_stats('SYS','TEST_TEMP2');
PL/SQL procedure successfully completed.
SQL> select blocks,tablespace_name from dba_tables where table_NAME='TEST_TEMP2
';
BLOCKS TABLESPACE_NAME
---------- ------------------------------
0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不占空间(另外临时表对优化有一定影响后面会介绍成本计算,card)
************************************
基本的操作:
alter table XX allocate extent (size 500K DATAFILE '') 手动分配区 分配HWM 后的,并指定datafile(不能跨表空间)
alter table NN move XX 移动TABLESPACE,并且可以收缩HWM,index失效 9I报error,10G无
alter table NN COMPRESS 压缩表 单写篇讲压缩表
unused
将列标记为删除,但不会实际删除空间~
SQL> create table t2 (a int,b int);
Table created.
SQL> declare
2 begin
3 for i in 1..200000 loop
4 insert into t2 values(i,i+1);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> desc t2;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
B NUMBER(38)
SQL> alter table t2 set unused column b;
alter table t2 set unused column b
*
ERROR at line 1:
ORA-12988: cannot drop column from table owned by SYS
SQL>
SQL> conn xh/a831115
Connected.
SQL>
SQL> create table t3 (a int,b int);
Table created.
SQL> declare
2 begin
3 for i in 1..200000 loop
4 insert into t3 values(i,i+1);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL>
SQL> alter table t3 set unused column b;
Table altered.
SQL>
SQL> desc t2;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)~~~~~~~~~~~~~~~~~看不见标记UNUSED 的column
SQL> desc dba_unused_col_tabs;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER NOT NULL VARCHAR2(30)
TABLE_NAME NOT NULL VARCHAR2(30)
COUNT NUMBER
SQL> select * from dba_unused_col_tabs;~标记为unused column的信息
OWNER TABLE_NAME COUNT
------------------------------ ------------------------------ ----------
XH T3 1
SQL> alter table t3 drop unused columns checkpoint 2000;真正的delete 每删除2000ROWS 检查点 写会一次
Table altered.
SQL> select * from dba_unused_col_tabs;~
no rows selected~~~~~~~~~~~~~~~~~~~~~~~~`
SQL> select * from dba_partial_drop_tabs;~~~~~~`如果drop时候 abort了,可以查到没drop完成的表
no rows selected
SQL> select distinct sid from v$mystat;
SID
----------
136
SQL> declare
2 begin
3 for i in 1..600000 loop
4 insert into t3 values(i,i+1);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL>
SQL> desc t2;
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> select * from dba_partial_drop_tabs;
no rows selected
SQL> select * from dba_unused_col_tabs;
no rows selected
SQL> alter table t3 drop unused columns checkpoint 2000;
alter table t3 drop unused columns checkpoint 2000
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel~~~~~~~~~~~~~~~~~~执行期间重启~造成没全部删除完成
SQL> startup force;
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 788672 bytes
Variable Size 145487680 bytes
Database Buffers 167772160 bytes
Redo Buffers 524288 bytes
Database mounted.
Database opened.
SQL> conn xh/a831115
Connected.
SQL> select * from dba_unused_col_tabs;
OWNER TABLE_NAME COUNT
------------------------------ ------------------------------ ----------
XH T3 1
SQL> select * from dba_partial_drop_tabs;
OWNER TABLE_NAME
------------------------------ ------------------------------~~~~~~~~~~
XH T3
SQL> alter table t3 drop columns CONTINUE checkpoint 2000;
Table altered.
SQL> select * from dba_partial_drop_tabs;
no rows selected
SQL> select * from dba_unused_col_tabs;
no rows selected
~~~~~~~~~~~~~~~~~~~~~~~~~另外要是drop列有FOREIGN KEY 要带
alter table XX set unused NN cascade constraints
SQL> create table t3 (a int, b int);
Table created.
SQL> alter table t3 set unused column a;
Table altered.
SQL> select column_name from dba_tab_columns where table_name='T3';
COLUMN_NAME
------------------------------
B
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
实验关于建立表时候的一些storge 参数
先看
tablespace 级别
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> col file_name format a40;
SQL> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
------------------------------ ----------------------------------------
TEST D:\TEST.DBF
EXAMPLE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EX
AMPLE01.DBF
USERS E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\US
ERS01.DBF
SYSAUX E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SY
SAUX01.DBF
UNDOTBS1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UN
TABLESPACE_NAME FILE_NAME
------------------------------ ----------------------------------------
DOTBS01.DBF
SYSTEM E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SY
STEM01.DBF
已选择6行。
SQL> create tablespace test2 datafile 'd:\test2.dbf' size 10m extent management loc
al default storage(initial 1m next 2m pctincrease 0 minextents 10 maxextents 20);
create tablespace test2 datafile 'd:\test2.dbf' size 10m extent management local de
fault storage(initial 1m next 2m pctincrease 0 minextents 10 maxextents 20)
*
第 1 行出现错误:
ORA-25143: 默认存储子句与分配策略不兼容~~~~~~~~~~~~~~~当 显示写上 extent management loc
al 的时候 不允许有storage 参数设置
SQL> create tablespace test2 datafile 'd:\test2.dbf' size 10m default storage(initi
al 1m next 2m pctincrease 0 minextents 10 maxextents 20);~~~~~~~~~~~~~不显示指定时候可以 写上 ,实际上本地管理后,这些参数已经废弃
字典管理时才有效 :initial 初始区大小,next 下一个区大小,第3个区大小 为上一个区大小+区大小*pctincrease(%) ,minextents 最小分配区,manextents最大分配区
表空间已创建。
SQL> select tablespace_name,initial_extent,next_extent,min_extents,pct_increase,ext
ent_management from dba_tablespaces where tablespace_name='TEST2';
TABLESPACE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PCT_INCREASE EXTENT_MAN
---------- -------------- ----------- ----------- ------------ ----------
TEST2 65536 1 LOCAL~~~~~~~~~~~~~~~~~~~~可以看出 那些存储参数都没有使用
但是oracle 分析了这些参数
SQL> create tablespace test3 datafile 'd:\test3.dbf' size 10m default storage(initi
al 2m next 2m pctincrease 10 minextents 10 maxextents 20);
表空间已创建。
SQL> create tablespace test4 datafile 'd:\test4.dbf' size 10m default storage(initi
al 2m next 2m pctincrease 0 minextents 10 maxextents 20);
表空间已创建。
SQL> select tablespace_name,initial_extent,next_extent,min_extents,pct_increase,ext
ent_management,allocation_type from dba_tablespaces where tablespace_name='TEST4';
TABLESPACE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PCT_INCREASE EXTENT_MAN
---------- -------------- ----------- ----------- ------------ ----------
ALLOCATIO
---------
TEST4 2097152 2097152 1 0 LOCAL ~~~~~~~~~~~~~~~~~~~~~~初始2M 大小 使用参数 oracle根据
UNIFORM initial 2m next 2m pctincrease 0 判断区大小为一个统一分区
SQL> select tablespace_name,initial_extent,next_extent,min_extents,pct_increase,ext
ent_management,allocation_type from dba_tablespaces where tablespace_name='TEST3';
TABLESPACE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PCT_INCREASE EXTENT_MAN
---------- -------------- ----------- ----------- ------------ ----------~~~~~~~~~~~~oracle根据initial 2m next 2m pctincrease 10判断为不一致 所以oracle 使用
system(autoallocate)自动
ALLOCATIO
---------
TEST3 65536 1 LOCAL
SYSTEM
SQL> col segment_name format a30
SQL> select extent_id,bytes/1024/1024,blocks ,segment_name,tablespace_name from use
r_extents where segment_name='T1';
EXTENT_ID BYTES/1024/1024 BLOCKS SEGMENT_NAME TABLESPACE
---------- --------------- ---------- ------------------------------ ----------
0 2 256 T1 TEST4
SQL> alter table t1 allocate extent;~~~~~~~~~~分配区
表已更改。
SQL> select extent_id,bytes/1024/1024,blocks ,segment_name,tablespace_name from use
r_extents where segment_name='T1';
EXTENT_ID BYTES/1024/1024 BLOCKS SEGMENT_NAME TABLESPACE
---------- --------------- ---------- ------------------------------ ----------
0 2 256 T1 TEST4
1 2 256 T1 TEST4
SQL> alter tablespace test4 add datafile 'd:\test4_2.dbf' size 10m;
表空间已更改。
SQL> alter table t1 allocate extent(size 1024k datafile 'd:\test4_2.dbf');
表已更改。
SQL> select extent_id,bytes/1024/1024,blocks ,segment_name,tablespace_name from use
r_extents where segment_name='T1';
EXTENT_ID BYTES/1024/1024 BLOCKS SEGMENT_NAME TABLESPACE
---------- --------------- ---------- ------------------------------ ----------
0 2 256 T1 TEST4
1 2 256 T1 TEST4
2 2 256 T1 TEST4 ~************小于uniform.
SQL> alter table t1 allocate extent(size 3m);~~~~~~~~~~~~~~分一个大于uniform的
表已更改。
SQL> col tablespace_name format a20
SQL> select extent_id,bytes/1024/1024,blocks ,segment_name,tablespace_name from use
r_extents where segment_name='T1';
EXTENT_ID BYTES/1024/1024 BLOCKS SEGMENT_NAME TABLESPACE_NAME
---------- --------------- ---------- -------------------- --------------------
0 2 256 T1 TEST4
1 2 256 T1 TEST4
2 2 256 T1 TEST4
3 2 256 T1 TEST4~1
4 2 256 T1 TEST4~~~2 ~~分了2个区~~~~~~~~~oracle 对size做了分析如果>uniform值(2M) 则分多个extent
如果小于则分一个区 大小为uniform值
SQL> select extent_id,file_id,block_id from dba_extents where segment_name='T1';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 9 9
1 9 265
2 10 9~~~~~~~~~~~~~~~~~~~~~~~~~datafile参数生效了
SQL> select file_id,file_name from dba_data_files where tablespace_name='TEST4';
FILE_ID FILE_NAME
---------- ----------------------------------------
9 D:\TEST4.DBF
10 D:\TEST4_2.DBF
SQL>
小结:oracle会对storage中设置参数分析下,如果判断为一致分区就用其中的initial参数值,如果为不统一(每个extents大小不一样)就用使用default设置(自动大小)
在自动确定区大小的时候,default 前16个 64KB(最小),后面的1M,如果blocksize为 16KB 那么 autoallocate时候 最小为1M (maxextents,minextents未起作用)
SQL> select tablespace_name,initial_extent,next_extent,min_extents,pct_increase,ext
ent_management,allocation_type,max_extents from dba_tablespaces where tablespace_na
me='SYSTEM';
TABLESPACE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PCT_INCREASE EXTENT_MAN
---------- -------------- ----------- ----------- ------------ ----------
ALLOCATIO MAX_EXTENTS
--------- -----------
SYSTEM 65536 1 LOCAL
SYSTEM 2147483645
说下system tablespace ,system 为local时候 就不允许建立字典tablespace了(10G R2 default为 local) 另外system 为local后 不允许作为default temporary tablespace使
用了,必须建立temporary tablespace (字典管理表空间时候 若没有temporary tablespace 那么将用system 作为temporary tablespace使用 alert.log中会有警告)
简单说下字典管理表空间就是用数据字典表管理 每个分配 释放时候都会在表里记录(主要维护 这两个表uet$,fet$)
当发生数据扩展的分配与回收时,Oracle会更新数据字典内相应的表。Oracle也会在更新数据字典表时存储相应的回滚信息(rollback information)。因为数据字典表与回滚段
(rollback segment)都是数据库的一部分,她们使用的空间如同其他数据库对象一样也必须进行空间管理操作,
在使用数据字典管理的表空间时,分配或回收方案对象(schema object)的数据扩展可能会导致数据字典表(data dictionary table)或回滚段(rollback segment)中也产生
分配或回收空间的操作,即称为递归的空间管理操作
本地就是用 bitmap管理记录datafile内 extent的状态,当一个extent分配或释放时候改变bitmap中相应extent的状态 ,bitmap中每一位带了一个区
SQL> desc dbms_space_admin包 可以对表空间有很多管理 ,可以多看看
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12020513/viewspace-613317/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12020513/viewspace-613317/