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;
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
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.我们可以对以下数据表进行统计分析,分析一些插入数据频繁的表,估算出一个周期的增长量,根据增长量,我们预先分配好区,来提升性能。
总结:
根据该实验我们加深对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/