oracle实验记录 (storage存储参数(1))

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/13808302/viewspace-666951/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13808302/viewspace-666951/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值