oracle分区表storage,oracle实验记录 (storage存储参数(1))

放入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包 可以对表空间有很多管理 ,可以多看看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值