[Oracle] oracle本地表空间在uniform、system等不同模式下分配extent方式


本文总阅读量

1、表空间和表都使用oracle默认参数

查看scott用户默认表空间:

1
2
3
4
select username,default_tablespace from dba_users where username='SCOTT';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SCOTT USERS

查看users表空间初始化extent大小:

1
2
3
4
5
select TABLESPACE_NAME,BLOCK_SIZE,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE from user_tablespaces where tablespace_name='USERS';

TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS EXTENT_MAN ALLOCATIO
------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ---------
USERS 8192 65536 1 2147483645 LOCAL SYSTEM

查看当前数据库块大小:

1
2
3
4
5
show parameter db_block_size;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192

创建测试表:

1
2
3
4
5
11:43:49 SCOTT@ boston>  create table t1 as select * from emp where 0=1;
Table created.
表数据为空,查看是否有extent区在:
11:43:54 SYS@ boston> select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T1';
no rows selected

向t1表内插入数据:

1
2
11:43:50 SCOTT@ boston>  insert into t1  select * from emp;
14 rows created.

查看已分配出一个8个block的extent:

1
2
3
4
5
6
11:43:55 SYS@ boston>  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 176 8
Elapsed: 00:00:00.50

因数据量太小,只分配了一个区,需插入大量数据:

1
2
3
4
5
6
12:00:40 SCOTT@ boston>  insert into t1  select * from t1;
42 rows created.
...
12:00:57 SCOTT@ boston> /
2688 rows created.
Elapsed: 00:00:00.02

再次查看extent,当分配16个extent之后,数据量达到了1688/1024=1M,当达到1m之后,在分配下一个extent会直接分配128个块,大小分为128*8/1024=1M:

1
2
3
4
5
6
7
8
12:01:01 SYS@ boston>  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 176 8
...
T1 15 4 296 8
T1 16 4 384 128

再次插入数据:

1
2
3
4
5
6
12:28:36 SCOTT@ boston> /
5376 rows created.
Elapsed: 00:00:00.02
....
12:30:11 SCOTT@ boston> /
688128 rows created.

查看extent情况:

1
2
3
4
5
6
7
8
9
10
11
12:30:14 SYS@ boston>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 176 8
....
T1 15 4 296 8
T1 16 4 384 128
...
T1 78 4 8320 128
T1 79 4 8448 1024
80 rows selected.

当表数据量达到64M的时候,再次分配下一个extent会直接分配1024个block,大小为64M。

手动对表t1分配extent

1
2
3
4
5
6
7
8
9
13:35:52 SCOTT@ boston> alter table t1 allocate extent;
Table altered.
Elapsed: 00:00:00.49
14:18:45 SCOTT@ boston> /
Table altered.
Elapsed: 00:00:00.07
14:19:28 SCOTT@ boston> /
Table altered.
Elapsed: 00:00:00.06

查看extent情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
14:19:06 SYS@ boston> 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 176 8
...
T1 15 4 296 8
T1 16 4 384 128
...
T1 78 4 8320 128
T1 79 4 8448 1024
T1 80 4 9472 128
T1 81 4 9600 128
T1 82 4 9728 128
83 rows selected.
Elapsed: 00:00:00.45

使用alter table ** allocate extent手动分配的区大小为1M。

再次对表插入数据:

1
2
3
14:19:30 SCOTT@ boston>  insert into t1  select * from t1;
1376256 rows created.
Elapsed: 00:00:12.03

查看extent情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
14:20:34 SYS@ boston> 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 176 8
...
T1 15 4 296 8
T1 16 4 384 128
...
T1 78 4 8320 128
T1 79 4 8448 1024
T1 80 4 9472 128
T1 81 4 9600 128
T1 82 4 9728 128
T1 83 4 9856 1024
...
T1 88 4 14976 1024
89 rows selected.

插入数据分配的extent大小均为64M。

2、表空间空间使用默认参数,表参数自定义(INITIAL参数小于65536):

创建测试表:

1
2
3
4
5
6
create table t2 as select * from emp where 0=1;
Table created.

ALTER TABLE t2 MOVE STORAGE ( INITIAL 20k NEXT 40k) TABLESPACE users;
Table altered.
Elapsed: 00:00:00.23

查看表参数:

1
2
3
4
SELECT initial_extent, next_extent,  min_extents, max_extents, pct_increase, blocks, sample_size FROM   user_tables WHERE  table_name = 'T2';
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLOCKS SAMPLE_SIZE
-------------- ----------- ----------- ----------- ------------ ---------- -----------
24576 40960

表数据为空,查看是否有extent区在:

1
2
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';
no rows selected

向表空插入数据

1
2
insert into t2 select * from emp;
insert into t2 select * from t2;

查看extent情况:

1
2
3
4
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T2 0 4 168 8

分配出来的extent最少8个块。
多次插入数据查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T2 0 4 168 8
...
T2 15 4 17184 8
T2 16 4 17280 128
...
T2 78 4 7936 128
T2 79 4 8064 1024
T2 80 4 9088 1024
T2 81 4 10112 1024
T2 82 4 11136 1024

extent分配增长情况为(64k-1m-64m-…)。

3、表空间空间使用默认参数,表参数自定义(INITIAL参数大于64k,next小于64k):

创建测试表:

1
2
3
4
5
6
 create table t3 as select * from emp where 0=1;
Table created.

ALTER TABLE t3 MOVE STORAGE ( INITIAL 100k NEXT 40k) TABLESPACE users;
Table altered.
Elapsed: 00:00:00.23

查看表参数:

1
2
3
4
5
SELECT initial_extent, next_extent,  min_extents, max_extents, pct_increase, blocks, sample_size FROM   user_tables WHERE  table_name = 'T3';

INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLOCKS SAMPLE_SIZE
-------------- ----------- ----------- ----------- ------------ ---------- -----------
106496 40960

表数据为空,查看是否有extent区在:

1
2
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T3';
no rows selected

向表空插入数据

1
insert into t3 select * from emp;

一次分配出来两个extent,每个extent8个block:

1
2
3
4
5
6
 select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T3';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T3 0 4 176 8
T3 1 4 184 8

再次插入数据:

1
insert into t3 select * from t3;

不要插入太多数据,查看下一次分配的extent为1个,占8个块

1
2
3
4
5
6
7
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T3';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T3 0 4 208 8
T3 1 4 216 8
T3 2 4 224 8

再次插入数据,extent增长情况(64k-1m-64m)

4、表空间空间使用默认参数,表参数自定义(INITIAL参数大于64k,next大于64k):

创建测试表:

1
2
3
4
5
6
 create table t4 as select * from emp where 0=1;
Table created.

ALTER TABLE t4 MOVE STORAGE ( INITIAL 100k NEXT 140k) TABLESPACE users;
Table altered.
Elapsed: 00:00:00.23

查看表参数:

1
2
3
4
5
14:31:43 SCOTT@ boston> SELECT initial_extent, next_extent,  min_extents, max_extents, pct_increase, blocks, sample_size FROM   user_tables WHERE  table_name = 'T4';

INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLOCKS SAMPLE_SIZE
-------------- ----------- ----------- ----------- ------------ ---------- -----------
106496 147456

表数据为空,查看是否有extent区在:

1
2
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T4';
no rows selected

向表空插入数据

1
insert into t4 select * from emp;

一次分配出来两个extent,每个extent8个block:

1
2
3
4
5
6
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T4';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T4 0 4 176 8
T4 1 4 184 8

再次插入数据:

1
insert into t4 select * from t4;

不要插入太多数据,查看下一次分配的extent为1个,占8个块

1
2
3
4
5
6
7
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T4';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T4 0 4 176 8
T4 1 4 184 8
T4 2 4 192 8

再次插入数据,extent增长情况(64k-1m-64m)

5、创建表空间使用并设置extent大小,统一为2m:

创建测试表空间

1
create tablespace test datafile '/data/u01/app/oracle/oradata/boston/test01.dbf' size 100M extent management local uniform size 2m;

查看表空间参数

1
2
3
4
5
15:28:39 SYS@ boston> select TABLESPACE_NAME,BLOCK_SIZE,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE from user_tablespaces where tablespace_name='TEST';

TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS EXTENT_MAN ALLOCATIO
------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ---------
TEST 8192 2097152 2097152 1 2147483645 LOCAL UNIFORM
6、表空间使用上面创建的test表空间,表参数默认:

创建测试表:

1
2
3
drop table t1;
create table t1 as select * from emp where 0=1;
alter table t1 move tablespace test;

查看表t1参数

1
2
3
4
5
SELECT initial_extent,next_extent,min_extents,max_extents,pct_increase,blocks,sample_size FROM user_tables WHERE  table_name = 'T1';

INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLOCKS SAMPLE_SIZE
-------------- ----------- ----------- ----------- ------------ ---------- -----------
2097152 2097152 1 2147483645 0

表数据为空,查看是否有extent区在:

1
2
3
4
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T1';
15:32:51 SYS@ boston> select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T1';
no rows selected
Elapsed: 00:00:00.04

插入数据

1
2
15:33:16 SCOTT@ boston> insert into t1  select * from emp;
14 rows created.

为t1表分配了一个2m大小的extent:

1
2
3
4
15:32:54 SYS@ boston> 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 5 128 256

批量插入数据

1
2
3
4
5
6
7
8
15:48:07 SYS@ boston> 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 5 128 256
...
T1 80 5 20608 256
81 rows selected.

不管插入多少数据,因为设置了统一大小为2m,一个extent永远都是256个块。

7、表空间使用上面创建的test表空间,表参数自定义:

创建测试表:

1
2
3
drop table t2;
create table t2 as select * from emp where 0=1;
ALTER TABLE t2 MOVE STORAGE ( INITIAL 5m NEXT 5m) TABLESPACE test;

查看表t2参数

1
2
3
4
5
SELECT initial_extent,next_extent,min_extents,max_extents,pct_increase,blocks,sample_size FROM user_tables WHERE  table_name = 'T2';

INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLOCKS SAMPLE_SIZE
-------------- ----------- ----------- ----------- ------------ ---------- -----------
5242880 5242880

表数据为空,查看是否有extent区在:

1
2
3
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';
no rows selected
Elapsed: 00:00:00.11

插入数据:

1
insert into t2 select * from emp;

因为初始化设置为5m,而每个extent大小统一为2m,因此分配出三个extent:

1
2
3
4
5
6
7
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T2 0 5 1920 256
T2 1 5 2176 256
T2 2 5 2432 256

再次插入数据,一次性不要插入太多:

1
2
3
insert into t2 select * from t2;
...
insert into t2 (select * from t2 where rownum < 10000);

当前三个extent用满之后再次分配extent时,分配1个extent,大小为2m。

1
2
3
4
5
6
7
select SEGMENT_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where OWNER='SCOTT' AND SEGMENT_NAME='T2';
SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--------------------------------------------------------------------------------- ---------- ---------- ---------- ----------
T2 0 5 640 256
T2 1 5 896 256
T2 2 5 1152 256
T2 3 5 1408 256

8、测试总结

在本地管理表空间的模式下,oracle分配extent,会根据initial指定的参数分配(按相应的倍数),但是next指定的值会被忽略。官方文档如下所示:

目录
  1. 1. 1、表空间和表都使用oracle默认参数
  2. 2. 2、表空间空间使用默认参数,表参数自定义(INITIAL参数小于65536):
  3. 3. 3、表空间空间使用默认参数,表参数自定义(INITIAL参数大于64k,next小于64k):
  4. 4. 4、表空间空间使用默认参数,表参数自定义(INITIAL参数大于64k,next大于64k):
  5. 5. 5、创建表空间使用并设置extent大小,统一为2m:
    1. 5.1. 6、表空间使用上面创建的test表空间,表参数默认:
    2. 5.2. 7、表空间使用上面创建的test表空间,表参数自定义:
  6. 6. 8、测试总结

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog