背景
创建表时不止可以指定initial和next,也可以指定minextents,或者maxextents;
本文主要熟悉下minextents及maxextents参数的含义及作用
结论
1,基于本地管理表空间,minextents是在表级别指定分配多少个区
这样就可以控制初始表段的大小
2,基于本地管理表空间,不能使用ALTER变更表的minextents
3,minextents及maxextents仅能在表级别定义,不适用于表空间级别
4,maxextents仅适用于字典管理表空间,指定最大为表段分配多少个区
5,要创建一个字典管理的表空间,SYSTEM表空间必须是字典管理模式,而SYSTEM表空间不能由本地管理转换为字典管理模式
测试
1,数据库版本
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
2,在本地管理的表空间下创建测试表,建表采用默认的参数值
SQL> select tablespace_name,initial_extent,next_extent,extent_management,allocation_type,segment_space_management from user_tablespaces where tablespace_name='USERS';
TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT EXTENT_MANAGEMENT ALLOCATION_TYPE SEGMENT_SPAC
------------------------------ -------------- ----------- -------------------- ------------------ ------------
USERS 65536 LOCAL SYSTEM AUTO
SQL> create table t_min_extents(a int,b int);
Table created.
SQL> insert into t_min_extents values(1,1);
1 row created.
SQL> commit;
Commit complete.
3,可见建表采用默值值时,min_extents为1,此参数含义为控制创建表段最少要创建多少个区
SQL> select segment_name,extents,min_extents from user_segments where lower(segment_name)='t_min_extents';
SEGMENT_NAME EXTENTS MIN_EXTENTS
------------------------------ ---------- -----------
T_MIN_EXTENTS 1 1
SQL> select count(*) from user_extents where lower(segment_name)='t_min_extents';
COUNT(*)
----------
1
4,如果显式指定minextents,测试表插入数据时分最少分配多少个区,可见minextents指定初始分配多少个区
SQL> drop table t_min_extents purge;
Table dropped.
SQL> create table t_min_extents(a int,b int) storage(minextents 3);
Table created.
SQL> insert into t_min_extents values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from user_extents where lower(segment_name)='t_min_extents';
COUNT(*)
----------
3
5,再看下minextents与其它参数的一些关系,从官方文档发现,基于本地管理表空间,ORACLE使用minextents以及initial,next,pctincrease决定表段的初始大小
而显式指定minextents相当于配置initial*minextents,这个就是初始表段的大小
SQL> select segment_name,bytes/1024/1024 segment_mb,blocks,initial_extent,next_extent,min_extents from user_segments where lower(segment_name)='t_min_extents';
SEGMENT_NAME SEGMENT_MB BLOCKS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS
------------------------------ ---------- ---------- -------------- ----------- -----------
T_MIN_EXTENTS 3 384 2162688 1048576 1
6,minextents官方文档说不适用于表空间级别,如果是本地管理表空间,不能使用alter变更表的minextents
SQL> alter table t_min_extents storage(minextents 5);
alter table t_min_extents storage(minextents 5)
*
ERROR at line 1:
ORA-25150: ALTERING of extent parameters not permitted
SQL> host oerr ora 25150
25150, 00000, "ALTERING of extent parameters not permitted"
// *Cause: An attempt was made to alter the extent parameters for a segment
// in a tablespace with autoallocate or uniform extent allocation
// policy.
// *Action: Remove the appropriate extent parameters from the command.
SQL>
7,maxextents参数作用类似于minextents,此参数指定段最大可以分配多少个区,此参数仅适用于字典管理表空间,而在本地管理表空间,会忽略此参数
SQL> drop table t_min_extents purge;
Table dropped.
SQL> create table t_extents(a int,b int) storage(minextents 4 maxextents 6);
Table created.
SQL> select segment_name,extents,min_extents from user_segments where lower(segment_name)='t_extents';
no rows selected
SQL> insert into t_extents values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select segment_name,extents,min_extents from user_segments where lower(segment_name)='t_extents';
SEGMENT_NAME EXTENTS MIN_EXTENTS
------------------------------ ---------- -----------
T_EXTENTS 4 1
SQL> select segment_name,extents,min_extents,max_extents from user_segments where lower(segment_name)='t_extents';
SEGMENT_NAME EXTENTS MIN_EXTENTS MAX_EXTENTS
------------------------------ ---------- ----------- -----------
T_EXTENTS 4 1 2147483645
SQL>
SQL> insert into t_extents select level,level from dual connect by level<=1000000;
1000000 rows created.
SQL> commit;
Commit complete.
虽显式指定maxextents为6,实际会忽略此参数配置
SQL> select count(*) from t_extents;
COUNT(*)
----------
1000001
8,要创建字典管理的表空间,SYSTEM表空间必须是字典管理模式,而SYSTEM表空间不能转换为字典管理模式,所以没有办法
SQL> create tablespace tbs_dict datafile '/oracle/oradata/guowang/dict1.dbf' size 30m autoextend on extent management dictionary;
create tablespace tbs_dict datafile '/oracle/oradata/guowang/dict1.dbf' size 30m autoextend on extent management dictionary
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace
SQL> host oerr ora 12913
12913, 00000, "Cannot create dictionary managed tablespace"
// *Cause: Attemp to create dictionary managed tablespace in database
// which has system tablespace as locally managed
// *Action: Create a locally managed tablespace.
create tablespace tbs_dict datafile '/oracle/oradata/guowang/dict1.dbf' size 30m autoextend on extent management dictionary;
个人简介
8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院
河北廊坊新奥集团公司
项目经验:
中国电信3G项目AAA系统数据库部署及优化
中国联通4G数据库性能分析与优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg
贵州移动crm及客服数据库性能优化项目
贵州移动crm及客服务数据库sql审核项目
深圳穆迪软件有限公司数据库性能优化项目
联系方式:
手机:18201115468
qq : 305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900
itpub博客名称:wisdomone1 http://blog.itpub.net/9240380/