在11.2.0.3(从11.2.0.2开始)创建分区表,每个分区默认大小为8M,是由_partition_large_extents参数控制,可以算是11.2.0.2开始的一个新特性,为了减少extent数量,提高分区表性能,而设置的一个参数,默认为true,即分区表的每个extent为8M,这里对于_partition_large_extents为true和false的情况进行了测试
_partition_large_extents=true
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
SQL> show parameter _partition_large_extents;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_partition_large_extents string FALSE
SQL> create table test_com_partition_1
2 (
3 name varchar2(4000) not null,
4 aaaaa number not null,
5 bbbbb varchar2(180) not null,
6 ccccc varchar2(4000),
7 constraint pk_test_com_partition_1 primary key(name)
8 )
9 partition by range(aaaaa) interval (1)
10 subpartition by range (bbbbb)
11 subpartition template
12 (
13 subpartition sp_2008 values less than ('2009') tablespace sp_2008,
14 subpartition sp_2009 values less than ('2010') tablespace sp_2009,
15 subpartition sp_2010 values less than ('2011') tablespace sp_2010,
16 subpartition sp_2011 values less than ('2012') tablespace sp_2011,
17 subpartition sp_2012 values less than ('2013') tablespace sp_2012,
18 subpartition sp_2013 values less than ('2014') tablespace sp_2013,
19 subpartition sp_2014 values less than ('2015') tablespace sp_2014,
20 subpartition sp_2015 values less than ('2016') tablespace sp_2015,
21 subpartition sp_2016 values less than ('2017') tablespace sp_2016,
22 subpartition sp_2017 values less than ('2018') tablespace sp_2017,
23 subpartition sp_2018 values less than ('2019') tablespace sp_2018,
24 subpartition sp_2019 values less than ('2020') tablespace sp_2019,
25 subpartition sp_2020 values less than ('2021') tablespace sp_2020,
26 subpartition sp_2021 values less than ('2022') tablespace sp_2021,
27 subpartition sp_2022 values less than ('2023') tablespace sp_2022,
28 subpartition sp_2023 values less than ('2024') tablespace sp_2023,
29 subpartition sp_2024 values less than ('2025') tablespace sp_2024,
30 subpartition sp_2025 values less than ('2026') tablespace sp_2025,
31 subpartition sp_max values less than (maxvalue) tablespace sp_max
32 )
33 (partition part_init values less than (1))
34 enable row movement;
Table created.
--数据库延迟对象创建
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments where tablespace_name
2 like 'SP%' group by TABLESPACE_NAME;
no rows selected
--只插入一个分区1,2013
SQL> insert into test_com_partition_1 values (lpad('xifenfei',3900,'wwww.xifenfei'),1,'2013',
2 rpad('aaafdfafd',4000,'b'));
1 row created.
SQL> commit;
Commit complete.
--所有分区全部都创建了segment
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments where tablespace_name like 'SP%'
2 group by TABLESPACE_NAME;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
SP_2018 8
SP_2022 8
SP_2021 8
SP_2025 8
SP_2011 8
SP_2008 8
SP_MAX 8
SP_2020 8
SP_2012 8
SP_2010 8
SP_2024 8
SP_2019 8
SP_2015 8
SP_2014 8
SP_2013 8
SP_2023 8
SP_2017 8
SP_2016 8
SP_2009 8
19 rows selected.
SQL> begin
2 for i in 3 .. 200 loop
3 insert into test_com_partition_1 values (to_char(i)||lpad('xifenfei',3900,'wwww.xifenfei'),mod(i,5),
'2013',rpad('xifenfei',4000,'www.xifenfei.com'));
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
--只是在2013的分区(1,子分区2013)中插入了对象,但是其他分区也都创建了segment(extent)
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments where tablespace_name
2 like 'SP%' group by TABLESPACE_NAME;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
SP_2018 32
SP_2021 32
SP_2022 32
SP_2008 32
SP_2011 32
SP_2025 32
SP_2010 32
SP_2012 32
SP_2020 32
SP_MAX 32
SP_2015 32
SP_2019 32
SP_2024 32
SP_2013 40
SP_2014 32
SP_2023 32
SP_2009 32
SP_2016 32
SP_2017 32
19 rows selected.
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2015';
PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_SUBP128 SP_2015
SYS_SUBP148 SP_2015
SYS_SUBP168 SP_2015
SYS_SUBP188 SP_2015
--因为在创建表语句中有partition part_init values less than (1),隐藏之类对于小于1的分区没有子分区,只有PART_INIT_SP_2013
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2013';
PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
PART_INIT_SP_2013 SP_2013
SYS_SUBP126 SP_2013
SYS_SUBP146 SP_2013
SYS_SUBP166 SP_2013
SYS_SUBP186 SP_2013
_partition_large_extents=false
SQL> alter system set "_partition_large_extents"=false;
System altered.
SQL> show parameter _partition_large_extents
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_partition_large_extents string FALSE
SQL> drop table test_com_partition_1 purge;
Table dropped.
SQL> alter system set deferred_segment_creation=true;
System altered.
SQL> create table test_com_partition_1
2 (
3 name varchar2(4000) not null,
4 aaaaa number not null,
5 bbbbb varchar2(180) not null,
6 ccccc varchar2(4000),
7 constraint pk_test_com_partition_1 primary key(name)
8 )
9 partition by range(aaaaa) interval (1)
10 subpartition by range (bbbbb)
11 subpartition template
12 (
13 subpartition sp_2008 values less than ('2009') tablespace sp_2008,
14 subpartition sp_2009 values less than ('2010') tablespace sp_2009,
15 subpartition sp_2010 values less than ('2011') tablespace sp_2010,
16 subpartition sp_2011 values less than ('2012') tablespace sp_2011,
17 subpartition sp_2012 values less than ('2013') tablespace sp_2012,
18 subpartition sp_2013 values less than ('2014') tablespace sp_2013,
19 subpartition sp_2014 values less than ('2015') tablespace sp_2014,
20 subpartition sp_2015 values less than ('2016') tablespace sp_2015,
21 subpartition sp_2016 values less than ('2017') tablespace sp_2016,
22 subpartition sp_2017 values less than ('2018') tablespace sp_2017,
23 subpartition sp_2018 values less than ('2019') tablespace sp_2018,
24 subpartition sp_2019 values less than ('2020') tablespace sp_2019,
25 subpartition sp_2020 values less than ('2021') tablespace sp_2020,
26 subpartition sp_2021 values less than ('2022') tablespace sp_2021,
27 subpartition sp_2022 values less than ('2023') tablespace sp_2022,
28 subpartition sp_2023 values less than ('2024') tablespace sp_2023,
29 subpartition sp_2024 values less than ('2025') tablespace sp_2024,
30 subpartition sp_2025 values less than ('2026') tablespace sp_2025,
31 subpartition sp_max values less than (maxvalue) tablespace sp_max
32 )
33 (partition part_init values less than (1))
34 enable row movement;
Table created.
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments
2 where tablespace_name like 'SP%' group by TABLESPACE_NAME;
no rows selected
SQL> insert into test_com_partition_1 values (lpad('xifenfei',3900,'wwww.xifenfei'),
2 1,'2013',rpad('aaafdfafd',4000,'b'));
1 row created.
SQL> commit;
Commit complete.
SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_segments where tablespace_name
2 like 'SP%' group by TABLESPACE_NAME;
Tablespace SUM(BYTES)/1024/1024
-------------------- --------------------
SP_2018 .0625
SP_2021 .0625
SP_2022 .0625
SP_2008 .0625
SP_2011 .0625
SP_2025 .0625
SP_2010 .0625
SP_2012 .0625
SP_2020 .0625
SP_MAX .0625
SP_2015 .0625
SP_2019 .0625
SP_2024 .0625
SP_2013 .0625
SP_2014 .0625
SP_2023 .0625
SP_2009 .0625
SP_2016 .0625
SP_2017 .0625
19 rows selected.
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2015';
Partition Name Tablespace
-------------------- --------------------
SYS_SUBP328 SP_2015
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2013';
Partition Name Tablespace
-------------------- --------------------
SYS_SUBP326 SP_2013
SQL> begin
2 for i in 3 .. 2000 loop
3 insert into test_com_partition_1 values (to_char(i)||lpad('xifenfei',3900,'wwww.xifenfei'),
mod(i,5),'2013',rpad('xifenfei',4000,'www.xifenfei.com'));
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2015';
Partition Name Tablespace
-------------------- --------------------
SYS_SUBP328 SP_2015
SYS_SUBP348 SP_2015
SYS_SUBP368 SP_2015
SYS_SUBP388 SP_2015
SQL> select PARTITION_NAME,TABLESPACE_NAME from dba_segments where TABLESPACE_NAME='SP_2013';
Partition Name Tablespace
-------------------- --------------------
PART_INIT_SP_2013 SP_2013
SYS_SUBP326 SP_2013
SYS_SUBP346 SP_2013
SYS_SUBP366 SP_2013
SYS_SUBP386 SP_2013
通过测试证明,设置_partition_large_extents参数确实是能够控制分区表的extent大小,而且对于分区表,deferred_segment_creation虽然为true,但是在一个分区表中如果有一个子分区插入了记录,那么其他子分区会同时创建segment.对于数据量不多,而且数据大量集中在某几个分区,那强烈建议设置_partition_large_extents为false,节约空间.如果数据量较大,而且数据分布较为均匀,建议设置_partition_large_extents为true.另外对于分区的index也有同样的参数为_index_partition_large_extents