1、创建表空间
语法:CREATE [UNDO] TABLESPACE tablespace_name
[DATAFILE datefile_spec1 [,datefile_spec2] ......
[{MININUM EXTENT integer [k|m]
|BLOCKSIZE integer [k]
|logging clause | FORCE LOGGING
|DEFAULT {data_segment_compression} storage_clause
|[online|offline]
|[PERMANENT|TEMPORARY]
|extent_manager_clause
|segment_manager_clause}]
引用 http://**/viewthread.php?tid=55627
1)、CREATE TABLESPACE USERS DATAFILE '...path/user01.dbf'SIZE 200M REUSE AUTOEXTEND ON
NEXT 1280K MAXSIZE 2000M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;
2)、CREATE TABLESPACE USERS DATAFILE '...path/user01.dbf'
SIZE 200M REUSE AUTOEXTEND ON
NEXT 1280K MAXSIZE 2000M
EXTENT MANAGEMENT LOCAL uniform. size 1280K
SEGMENT SPACE MANAGEMENT AUTO ;
通过查看dba_tablespaces,uniform. size体现在ALLOCATION_TYPE列,
采用第一种方法创建表表空间时,ALLOCATION_TYPE列的值为SYSTEM,也
就是默认由系统进行extent的扩展分配,大家通常采用哪种方法创建表空间呢?
要创建本地管理表空间,在CREATE TABLESPACE命令中将EXTENT MANAGEMENT 子句中设定LOCAL关键字。然后可以有两个选择:
设定让Oracle自动管理区——使用AUTOALLOCATE选项(缺省);
设定使用统一区大小管理表空间(UNIFORM. SIZE)。
如果希望表空间中包含不同大小的区的对象和许多区,则AUTOALLOCATE是最佳的选择。对于用户来说,如果空间的分配与释放的控制不是非常重要,则AUTOALLOCATE可以提供一种简化的表空间管理方式。这种方式可能会浪费一些空间,但是Oracle管理空间带来的优点可以抵消这个缺点。
另外一方面,如果希望更好地控制没有使用的空间,并且能够准确地预言为对象分配的空间以及区的大小和数量,则UNIFORM是一个好的选择。这个选项保证了数据库中不会有未使用的空间。
注意:当不明确设定区管理的类型,并且缺省将创建本地管理表空间,Oracle将按照如下规则决定区管理。
在CREATE TABLESPACE命令中如果没有包含DEFAULT存储子句,Oracle将创建一个本地管理自动分配(autoallocated)表空间。
在CREATE TABLESAPCE命令中如果包含了DEFAULT存储子句,Oracle将遵循以下规则:
如果设定了MINIMUM EXTENT子句,Oracle会推断MINIMUM EXTENT、INITIAL、NEXT的值是否相等以及PCTINCREASE的值是否为0,如果相等并且PCTINCREASE值为0,Oracle将创建本地管理的uniform表空间并且区大小等于INITIAL。如果MINIMUM EXTENT、INITIAL、NEXT的值不相等,或者PCTINCREASE的值不等于0,Oracle将忽略可以设定的任何区存储参数,并创建一个本地管理的autoallocated表空间。
如果没有设定MINIMUM EXTENT子句,Oracle仅推断INITAIL和NEXT的值是否相等以及PCTINCREASE的值是否为0,如果相等并PCTINCREASE的值为0,表空间是本地管理和uniform。否则,表空间将是本地管理和autoallocated。
以下的示例命令将创建名为lmtbsb01的表空间并设定AUTOALLOCATED:
CREATE TABLESPACE lmtbs ‘/u02/oracle/data/ltbsb01.dbf’ SIZE 50M EXTENT MANAGEMNET LOCAL AUTOALLOCATE ;
AUTOALLOCATE将导致由系统管理表空间,并使用最小的区大小——64K。在自动分配的表空间中,对象空间的增长按照initial大小自动增长。由于在字典管理表空间中最小的区大小为2个blocks,但是,在自动分配的本地管理表空间中,最小的对象大小为64K。
作为可以选择的,表空间也可以通过设定UNIFORM创建。如果UNIFORM. SIZE被设定,表空间将由uniform. size管理,缺省的SIZE为1M。
2、数据表的创建
如果是流水表建议根据日期做成分区表,分区后在做检索是可以oracle会自动进行分区裁剪,可以缩小查询量,提高效率。
9i以后建议使用本地管理的表空间,这样一般不再显式的指定initial,next,pctincrease这些参数,由oracle自动管理即可。如果这张表经常有大量的更新操作建议将pctfree设大一些,这个值大了可以保证一个block中有足够的剩余空间用于后续的dml操作,尽量避免产生行迁移。pctused一般不需要太关心,使用默认值即可,这个参数的含义是:假设设的值为20,那就是说当一个block的使用率将低到20%一下以后,这个块oracle就认为该块是空闲的了,下面再有新的插入动作就会使用这个block的剩余的存储空间进行数据存储。
较高的pctfree的值大约在20到25之间,较低的值为4或5,可用于静态表或只读表。
除非要严格地管理可用空间,否则不要设置pctused超过40或50。
一般这两个值地和不能达到90,否则会使Oarcle将更多地时间花费在处理空间利用上。下面是几个参考:
pctfree 5,pctused 40 适合于静态表或只读表。
pctfree 10,pctused 50 适合插入行后,更新活动不会增加已有行地长度地综合性OLTP系统。
pctfree 20,pctused 40 适合于插入行后,更新活动会增加已有行地长度地OLTP系统。
b 、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少;
c 、维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多;
d 、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
e 、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快;
f 、分区对用户透明,最终用户感觉不到分区的存在。
删除分区和TRUNCATE分区表中数据,会造成主键和全局索引的失效。如果数据表非常大,索引的重建也是需要花很长时间的。
首先根据应用尽量将索引修改为分区索引(个别索引可能不能修改),删除主键也修改为唯一分区索引。
经过测试表明,如果分区字段选择合理,使用分区索引的效率比全局索引要高一些,而主键和唯一分区索引的效率大体相当,因此这样的优化还是非常值得的,如果由于优化导致个别应用效率下降,也可以通过应用的调整进行优化。
需要特别注意的几个方面:
a. 如果个别索引不适合使用分区索引,在执行删除分区的操作时最好增加update global indexes子句,示例如下:alter table xxx drop partition yyy update global indexes ,以保证全局索引同步更新,避免对应用造成影响。
b. 分区的创建和删除等维护操作最好采用手工的方式在数据库相对比较空闲的时段进行,特别是分区的删除操作,由于需要释放磁盘空间并同步更新索引,容易产生一些意外。
c. 在分区表上创建的唯一索引必须包含分区字段,否则会提示错误(ORA-14039),这一点也需要特别注意。
d. 在分区表上增加或者拆分分区时分区索引会同步进行更新,不需要进行索引重建和分析操作,如有必要可以动态创建分区,以满足应用的需要。
4). 创建分区表的实例:
CREATE TABLE EDU.TJ_RESULT_PARTITION
(
ID NUMBER(8) NOT NULL,
MSG_ID NUMBER(8) NOT NULL,
AINSERVICEID VARCHAR2(10) NOT NULL,
STATE NUMBER(1) DEFAULT 0 NOT NULL,
MSGMODE NUMBER(1) NULL,
SERVICEID VARCHAR2(10) NOT NULL,
SRCTERMID VARCHAR2(22) NOT NULL,
DESCTERMID VARCHAR2(22) NOT NULL,
FEETERMINALID VARCHAR2(22) NOT NULL,
SRC_MOBILE VARCHAR2(11) DEFAULT '0' NOT NULL,
SRC_ACCOUNTID NUMBER(8) DEFAULT 0 NOT NULL,
SRC_PERSONID NUMBER(8) DEFAULT 0 NOT NULL,
SRC_ORGID NUMBER(6) DEFAULT 0 NOT NULL,
VALIDTIME DATE NULL,
ATTIME DATE NULL,
FINISHDATE DATE DEFAULT sysdate NOT NULL
)
TABLESPACE EDUCATION
NOLOGGING
PCTFREE 10
PCTUSED 40
INITRANS 10
MAXTRANS 255
STORAGE(PCTINCREASE 0
FREELISTS 5
FREELIST GROUPS 2
BUFFER_POOL KEEP)
NOPARALLEL
NOCACHE
PARTITION BY RANGE(FINISHDATE)
(
PARTITION PARTITION_200605 VALUES LESS THAN (TO_DATE(' 2006-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200606 VALUES LESS THAN (TO_DATE(' 2006-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200607 VALUES LESS THAN (TO_DATE(' 2006-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200608 VALUES LESS THAN (TO_DATE(' 2006-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200609 VALUES LESS THAN (TO_DATE(' 2006-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200610 VALUES LESS THAN (TO_DATE(' 2006-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200611 VALUES LESS THAN (TO_DATE(' 2006-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
TABLESPACE EDUSPACE,
PARTITION PARTITION_200612 VALUES LESS THAN (TO_DATE(' 2007-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
LOGGING)
/
5). 创建唯一分区索引的实例:
CREATE UNIQUE INDEX EDU.PARTITION_PRIMARY
ON EDU.TJ_RESULT_PARTITION
(ID, FINISHDATE)
LOGGING
LOCAL (
PARTITION PARTITION_200605
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200606
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200607
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200608
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200609
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200610
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200611
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200612
LOGGING
NOCOMPRESS
)
6). 创建普通分区索引的实例:
CREATE INDEX EDU.PARTITION_FINISHDATE
ON EDU.TJ_RESULT_PARTITION
(FINISHDATE)
LOGGING
LOCAL (
PARTITION PARTITION_200605
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200606
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200607
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200608
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200609
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200610
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200611
LOGGING
NOCOMPRESS,
PARTITION PARTITION_200612
LOGGING
NOCOMPRESS
)
7). 分区维护实例:
a. 删除分区:
ALTER TABLE EDU.TJ_RESULT_PARTITION DROP PARTITION PARTITION_200610;
b. 增加分区:
ALTER TABLE EDU.TJ_RESULT_PARTITION ADD PARTITION PARTITION_200701 VALUES LESS THAN
(TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
LOGGING NOCOMPRESS;
c. 拆分分区:
ALTER TABLE EDU.TJ_RESULT_PARTITION
SPLIT PARTITiON PARTITION_200608 AT (TO_DATE('2006-08-15','YYYY-MM-DD'))
INTO (partition PARTITION_20060801 , partition PARTITION_20060802)
create index idx_m_send_id on sms_confirm_month(send_id)
local
(
partition idx_m_send_id_1 tablespace SMS_INDEX1,
partition idx_m_send_id_2 tablespace SMS_INDEX1,
partition idx_m_send_id_3 tablespace SMS_INDEX1,
partition idx_m_send_id_4 tablespace SMS_INDEX1,
partition idx_m_send_id_5 tablespace SMS_INDEX1,
partition idx_m_send_id_6 tablespace SMS_INDEX1,
partition idx_m_send_id_7 tablespace SMS_INDEX1,
partition idx_m_send_id_8 tablespace SMS_INDEX1,
partition idx_m_send_id_9 tablespace SMS_INDEX1,
partition idx_m_send_id_10 tablespace SMS_INDEX1,
partition idx_m_send_id_11 tablespace SMS_INDEX1,
partition idx_m_send_id_12 tablespace SMS_INDEX1
);
9)
分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响。
oracle会对主键自动创建全局索引
如果想在主键的列上创建分区索引,除非主键包括分区键,还有就是主键建在两个或以上列上。
在频繁删除表的分区且数据更新比较频繁时为了维护方便避免使用全局索引。
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1
select tablespace_name,
count(*) as extends,
round(sum(bytes) / 1024 / 1024, 2) as MB,
sum(blocks) as blocks
from dba_free_space
group by tablespace_name;
select
tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_data_files
group by tablespace_name;
select total.tablespace_name,
round(total.MB, 2) as Total_MB,考试大论坛
round(total.MB - free.MB, 2) as Used_MB,
round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct
from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_free_space
group by tablespace_name) free,
(select tablespace_name, sum(bytes) / 1024 / 1024 as MB
from dba_data_files
group by tablespace_name) total
where free.tablespace_name = total.tablespace_name;
4k的blocksize那么它的datafile max size就是16G
8k的blocksize那么它的datafile max size就是32G
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11949963/viewspace-730481/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11949963/viewspace-730481/