Oracle 区 EXTENT

Oracle的基本概念extent,理解Oracle的基本知识原理,通过实验加深的对基本概念的理解,
为后期学习数据优化打下坚实的基础。
什么是extent,一次分配的连续的oracle
建立表时分配新的区(extent)(10g),11g中不会立刻分配区,只有插入了第一条数据后才会分配区。注意版本的区别。
conn system/manager
grant select any dictionary to scott;
使scott用户可以查看数据字典。
SQL> conn scott/tiger
Connected.
彻底的清除表t1.
SQL> DROP TABLE t1 PURGE;
Table dropped.
 
建立新的表t1.
SQL>CREATE TABLE t1 AS SELECT * FROM EMP;
Table created.
 
SQL> SELECT SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    WHERE OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                           0          4         89          8
T1表建立的时候会分配新的空间,这个空间叫做初始区EXTENT,即使是一个空表也有初始区EXTENT(10g之前的版本,11g后只有插入第一条数据后才分配),初始区EXTENT和其它以后的区EXTENT都不同,因为初始区EXTENT中含有表头块,这个数据块中没有我们的数据。首先数据库要找到在哪个表空间中分配空间,如果我们在建立表的时候没有指明,那么就从默认表空间中分配。我们scott用户的默认表空间是users,users表空间的数据文件是4号文件.
在4号文件中的第89个块以后有连续8个空闲空间,为什么要分派8个数据块,而不是其它数量的数据块呢?这要由users表空间的属性来决定。这个属性是在我们建立表空间时决定的。
 
SQL> SELECT TABLESPACE_NAME,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS
    FROM DBA_TABLESPACES;
 
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
--------------- -------------- ----------- ----------- -----------
SYSTEM                   65536                       1 2147483645
UNDOTBS1                 65536                       1 2147483645
SYSAUX                   65536                       1 2147483645
TEMP                   1048576     1048576           1
USERS                    65536                       1 2147483645
TEMP2                  1048576     1048576           1
BIGTS                    65536                       1 2147483645
TP1                    1048576     1048576           1
TL                       65536                       1 2147483645
TS1                      65536                       1 2147483645
USERS表空间INITIAL_EXTENT初始区大小(65536),数据库的块大小为8192*8=INITIAL_EXTENT。
 
我们向表t1中添加新的数据,增长时分配新的区(extent)
SQL> insert into t1 select * from t1;
 
14 rows created.
增加一倍的数据。
SQL> SELECT SEGMENT_NAME,EXTENT_ID,FILE_ID, BLOCK_ID,BLOCKS
    FROM DBA_EXTENTS
    WHERE OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4        89          8
我们的t1表没有分配新的空间,因为8个块可以存放所有的行。
SQL> insert into t1 select * from t1;
 
28 rows created.
增加一倍的数据。
 
SQL> SELECT SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    WHERE OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
我们的t1表没有分配新的空间,因为8个块可以存放所有的行。
 
SQL> insert into t1 select * from t1;
 
56 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
我们的t1表没有分配新的空间,因为8个块可以存放所有的行。
 
 
SQL> insert into t1 select * from t1;
 
112 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
我们的t1表没有分配新的空间,因为8个块可以存放所有的行。
 
SQL> insert into t1 select * from t1;
 
224 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
我们的t1表没有分配新的空间,因为8个块可以存放所有的行。
 
SQL> insert into t1 select * from t1;
 
448 rows created.
增加一倍的数据。
 
SQL> SELECT SEGMENT_NAME,EXTENT_ID,FILE_ID, BLOCK_ID,BLOCKS FROM dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
我们的t1表分配新的空间,因为8个块不能存放所有的行。必须要有新的空间来存放数据。
为什么是521呢?因为在521数据块前有其它表的数据。数据库在521以后找到了连续的8个数据块。
 
SQL> insert into t1 select * from t1;
 
896 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
我们的t1表没有分配新的空间,因为16个块可以存放所有的行。
SQL> insert into t1 select * from t1;
 
1792 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
T1                            2          4        537          8
T1                            3          4        545          8
我们的t1表分配新的空间,因为16个块不能存放所有的行。必须要有新的空间来存放数据。
为什么是537呢?因为在537数据块前有其它表的数据。数据库在537以后找到了连续的8个数据块。
空间还是不够,又分配了新的范围。在545数据块后又分配了8个块。
 
 
SQL> insert into t1 select * from t1;
 
3584 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
 2 BLOCK_ID,BLOCKS from dba_extents
 3 where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
T1                            2          4        537          8
T1                            3          4        545          8
T1                            4          4        553          8
T1                            5          4        561          8
T1                            6          4        569          8
又分配了3个新的范围。
SQL> insert into t1 select * from t1;
 
7168 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
T1                            2          4        537          8
T1                            3          4        545          8
T1                            4          4        553          8
T1                            5          4        561          8
T1                            6          4        569          8
T1                            7          4        577          8
T1                            8          4        585          8
T1                            9          4        593          8
T1                           10          4        601          8
T1                           11          4        609          8
又分配了4个新的范围。
 
SQL> insert into t1 select * from t1;
 
14336 rows created.
增加一倍的数据。
 
SQL> select SEGMENT_NAME,EXTENT_ID,FILE_ID,
    BLOCK_ID,BLOCKS from dba_extents
    where OWNER='SCOTT' AND SEGMENT_NAME='T1';
 
SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
T1                            0          4         89          8
T1                            1          4        521          8
T1                            2          4        537          8
T1                            3          4        545          8
T1                            4          4        553          8
T1                            5          4        561          8
T1                            6          4        569          8
T1                            7          4        577          8
T1                            8          4        585          8
T1                            9          4        593          8
T1                           10          4        601          8
T1                           11          4        609          8
T1                           12          4        617          8
T1                           13          4        625          8
T1                           14          4        633          8
T1                           15          4        641          8
T1                           16          4        137        128
 
为什么最后一个范围的大小是128个数据块,而不是8个了。因为数据库已经分配了16个范围,共分配了1M的空间,我们还要求分配新的空间,数据库认为这个表很大,所以就一次分了128个数据块。如果我们再增加表的大小,数据库会分配多个1m,以后就8m为大小分配,再以后就64m大小分配。总之是一个原则,我们现有的数据越大,未来的范围就越大。
上面的情况都是Oracle数据库自动完成的,但是我们也可以 手工分配区extent
alter table t1 allocate extent;
alter table t1 allocate extent(datafile 'D:\ORACLE\ORADATA\O10\USERS01.DBF size 9k);
 
手工回收未使用的范围
alter table t1 deallocate unused;
查看结果
select SEGMENT_NAME,EXTENT_ID,FILE_ID,
BLOCK_ID,BLOCKS from dba_extents
where OWNER='SCOTT' AND SEGMENT_NAME='T1';

总结:
根据该实验我们加深对ORACLE工作原理机制。
1.我们可以在插入大量数据时,可以手动分配一下区,这样在插入的时候节省了分配区的时间,能改善Oracle的性能,提高插入的速度。
2.我们可以对以下数据表进行统计分析,分析一些插入数据频繁的表,估算出一个周期的增长量,根据增长量,我们预先分配好区,来提升性能。


pxboracle@live.com
2014.08.13 09:24
share you knowledge with the world. 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12798004/viewspace-1250248/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12798004/viewspace-1250248/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值