ORACLE_1表空间和分区

469 阅读9分钟

表空间和分区

参考文献:www.cnblogs.com/wayne-ivan/… www.iteye.com/blog/elim-1…

1、表空间:

​ 表空间是数据的逻辑划分,一个表空间只属于一个数据库。每个表空间由一个或多个数据文件组成。但主要存放的是表, 所以称作表空间。Oracle数据库中至少存在一个表空间,即SYSTEM的表空间。

​ 表空间中其他逻辑结构的数据存储在这些数据文件中。Oracle安装完成后,会自动创建多个表空间,一般主要有:

  • System表空间:该表空间用于村fangORacle系统内部表和数据字典的数据。如表名、列名、用户名等;
  • undo表空间:该表空间是存放撤销信息的表空间,用户对数据库执行修改操作(insert、delete、update)时,Oracle 会自动使用undo表空间来临时存放修改前的数据。当所有修改操作执行完毕并提交后,系统根据设置的需要保留修改前数据的时长来释放undo 表空间的部分空间;
  • users表空间: 该表空间是给用户使用的表空间。
  • temporary表空间:该表空间是给用户临时使用的表空间,

​ 可以使用OEM(Oracle Enterprise Manager)管理表空间,也可以使用命令管理表空间。利用OEM管理表空间是非常简单的,只需要根据系统提示进行操作就可以了。利用create tablespace 命令会创建一个读/写表空间,以后可以利用alter tablespace 语句来使表空间脱机或联机、给它添加数据文件或使它成为只读表空间。也可以利用drop tablespace 语句从数据库中撤销表空间。

(1)利用create tablespace命令创建表空间。使用该命令的用户必须具有创建表空间的权限。

语法格式:

create tablespace tablespace_name datafile 'path/fileName' [size integer [K | M]] [reuse]  
[autoextend [off | on [next integer [K | M]]] [maxsize [unlimited | integer [K | M]]]]  
[minmum extent integer [K | M]]  
[default storage storage_clause]  
[online | offline]  
[logging | nologging]  
[extent management [dictionary | local [autoallocate | uniform [size integer [K | M]]]]] 

其中:

tablespace_name:是将要创建的表空间的名称,该名称在数据库中是唯一的,并且命名必须符合命名规则。

path/fileName: 数据文件的存放路径和名称。当使用关键字reuse时表示若该文件存在,则清除该文件再重新建立该文件;如该文件不存在,则建立新文件。

off/on: 禁止或允许自动扩展数据文件。若选则off, 则禁止自动扩展;若选择on,则允许自动扩展数据文件

next:表示当需要更多的磁盘空间时,一次给数据文件分配的磁盘空间,以KB或MB为单位。

maxsize umlimited | integer[K | M]:指定允许分配给数据文件的最大磁盘空间,其中unlimited表示没有限制。

minmum extent:指定最小的长度,默认为操作系统和数据库块。

online:在创建表空间后使该表空间立即可以被授权用户访问,这是默认设置。

offline:则表示不可用

logging/nologging:表示将来的表、索引等是否需要进行日志处理,默认为需要

extent management:指定如何管理表空间的盘区。

dictionary:使用字典表来管理表空间,这是默认设置。

local:指定本地管理表空间

autoallocate:指定表空间由系统管理,用户不能指定盘区尺寸。

uniform:使用size字节的统一盘区来管理表空间。默认的size是1MB。

注意:如果指定了local,就不能指定default storage storage_clause 和temporary。

2、分区

在非常大的数据库中,通常可以把一个大表的数据分成多个小表来简化数据库的管理,这些小表叫做分区,除了对表分区外,还可以对索引进行分区。分区不仅简化了数据库的管理,还改善了应用性能。在Oracle中,还可以细分分区,创建子分区。

并不是任何时候都需要使用表分区,当:表的大小超过2GB、表中包含历史数据被增加到新的分区中,只有日期型(date)或二进制大对象(Blob)等数据类型的表列可以分区。

Oracle有以下几种分区方法:

(1)范围分区:根据列值的范围将行映射到分区。范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。

当使用范围分区时,请考虑以下几个规则:

1、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。

(2)散列分区:散列分区提供了一种方法,可在指定数量的分区间平均分布数据。这种方法将根据分区关键字的散列值将行映射到分区。

(3)列表分区:列表分区可以显式地控制如何把行映射到分区。

(4)范围-散列分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用散列方法将其分成子分区。

(5)范围-列表分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用列表方法将其分成子分区

有关表分区的一些维护性操作:

添加分区以下代码给SALES表添加了一个P3分区

ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

注意:以上添加的分区界限应该高于最后一个分区界限。

以下代码给SALES表的P3分区添加了一个P3SUB1子分区

ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

删除分区以下代码删除了P3表分区:

ALTER TABLE SALES DROP PARTITION P3;

以下代码删除了P4SUB1子分区:

ALTER TABLE SALES DROP SUBPARTITION P4SUB1;

注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

截断分区截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:

ALTER TABLE SALES TRUNCATE PARTITION P2;

通过以下代码截断子分区:

ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;

合并分区合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。

以下代码实现了P1 P2分区的合并:

ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

拆分分区拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。

ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);

接合分区(coalesca)结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:

ALTER TABLE SALES COALESCA PARTITION; 重命名表分区以下代码将P21更改为P2

ALTER TABLE SALES RENAME PARTITION P21 TO P2;

相关查询-- 跨分区查询

select sum( *) from(select count(* ) cn from t_table_SS PARTITION (P200709_1)union allselect count(*) cn from t_table_SS PARTITION (P200709_2));

--查询表上有多少分区

SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'

--查询索引信息

select object_name,object_type,tablespace_name,sum(value)from v$segment_statisticswhere statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'group by object_name,object_type,tablespace_nameorder by 4 desc

--显示数据库所有分区表的信息:select * from DBA_PART_TABLES

--显示当前用户可访问的所有分区表信息:select * from ALL_PART_TABLES

--显示当前用户所有分区表的信息:select * from USER_PART_TABLES

--显示表分区信息 显示数据库所有分区表的详细分区信息:select * from DBA_TAB_PARTITIONS

--显示当前用户可访问的所有分区表的详细分区信息:select * from ALL_TAB_PARTITIONS

--显示当前用户所有分区表的详细分区信息:select * from USER_TAB_PARTITIONS

--显示子分区信息 显示数据库所有组合分区表的子分区信息:select * from DBA_TAB_SUBPARTITIONS

--显示当前用户可访问的所有组合分区表的子分区信息:select * from ALL_TAB_SUBPARTITIONS

--显示当前用户所有组合分区表的子分区信息:select * from USER_TAB_SUBPARTITIONS

--显示分区列 显示数据库所有分区表的分区列信息:select * from DBA_PART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的分区列信息:select * from ALL_PART_KEY_COLUMNS

--显示当前用户所有分区表的分区列信息:select * from USER_PART_KEY_COLUMNS

--显示子分区列 显示数据库所有分区表的子分区列信息:select * from DBA_SUBPART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的子分区列信息:select * from ALL_SUBPART_KEY_COLUMNS

--显示当前用户所有分区表的子分区列信息:select * from USER_SUBPART_KEY_COLUMNS

--怎样查询出oracle数据库中所有的的分区表select * from user_tables a where a.partitioned='YES'

--删除一个表的数据是truncate table table_name;

--删除分区表一个分区的数据是alter table table_name truncate partition p5;