分区提供以下优点:
(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;
(2)可以对单独的分区进行备份和恢复;
(3)可以将分区映射到不同的物理磁盘上,来分散IO;
(4)提高可管理性、可用性和性能
Oracle 10g提供了以下几种分区类型:
(1)范围分区(range);
(2)哈希分区(hash);
(3)列表分区(list);
(4)范围-哈希复合分区(range-hash);
(5)范围-列表复合分区(range-list)。
一。分区的类型及创建
建议使用Range分区时,要创建一个maxvalue分区存储那些不在指定范围内的记录,
若无对应的分区能包含插入的数据,则报错"ora-14400:插入的分区关键字未映射到任何分区"
1.范围分区
CREATE TABLE T_RANGE
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY RANGE(CREATED)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2007-01-01','YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2008-01-01','YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (TO_DATE('2009-01-01','YYYY-MM-DD')),
PARTITION P5 VALUES LESS THAN (TO_DATE('2010-01-01','YYYY-MM-DD')),
PARTITION P6 VALUES LESS THAN (TO_DATE('2011-01-01','YYYY-MM-DD')),
PARTITION P7 VALUES LESS THAN (TO_DATE('2012-01-01','YYYY-MM-DD')),
PARTITION P8 VALUES LESS THAN (MAXVALUE)
);
访问方式:
SELECT * FROM T_RANGE PARTITION(XX);--XX是分区的名称
2.hash分区
对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中rttgggtgv
列所在分区是依据分区列的hash值自动分配,相同的分区列值会分在同一个分区。你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区支持多个依赖列。
--Oracle 建议散列分区数要使用2的幂个数,从而得到在多个分区上比较均匀的分布.选择分区hash键值应当是唯一一个列或一组列,或者至少足够多的相异值。
--另外需要注意一点,当散列分区修改分区个数,数据会在所有分区中重新分布(向一个散列分区增加或删除一个分区时,会导致所有数据重写,因为现在每一个行可能属于不同的分区)。
--The concepts of splitting, dropping or merging partitions do not apply to hash partitions. Instead, hash partitions can be added and coalesced.
--
CREATE TABLE T_HASH
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY HASH(OBJECT_TYPE)
(
PARTITION P1,
PARTITION P2,
PARTITION P3
);
访问方式:
SELECT * FROM T_HASH PARTITION(XX);--XX是分区的名称
3.列表分区
List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。
在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,
类似range分区中的maxvalue分区。
CREATE TABLE T_LIST
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY LIST(OBJECT_TYPE)
(
PARTITION P1 VALUES ('TABLE'),
PARTITION P2 VALUES ('INDEX'),
PARTITION P3 VALUES (DEFAULT)
);
组合分区:
如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。
组合分区呢在10g中有两种:range-hash,range-list。注意顺序,根分区只能是range分区,子分区可以是hash分区或list分区。
组合分区分为无模板和有模板创建方式。
4.范围-列表复合分区(无模板)
CREATE TABLE T_RANGE_HASH
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY RANGE(CREATED) SUBPARTITION BY HASH(OBJECT_TYPE)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD'))
(
SUBPARTITION SP1,SUBPARTITION SP2--经测试,子分区的个数可以不一样。
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))
(
SUBPARTITION SP3,SUBPARTITION SP4
),
PARTITION P3 VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION SP5, SUBPARTITION SP6
)
)
partition是逻辑分区,subpartition才是真正的分区segment,通过下面的sql可以看出:
SQL> SELECT SEGMENT_NAME,PARTITION_NAME,SEGMENT_TYPE FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_RANGE_HASH';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
--------------------------------------------------------------------------------- ------------------------------ ------------------
T_RANGE_HASH SP1 TABLE SUBPARTITION
T_RANGE_HASH SP2 TABLE SUBPARTITION
T_RANGE_HASH SP3 TABLE SUBPARTITION
T_RANGE_HASH SP4 TABLE SUBPARTITION
T_RANGE_HASH SP5 TABLE SUBPARTITION
T_RANGE_HASH SP6 TABLE SUBPARTITION
访问方式:
SELECT * FROM T_RANGE_HASH PARTITION(XX);--xx 分区名称
SELECT * FROM T_RANGE_HASH SUBPARTITION(XX);--xx 子分区名称
范围-列表复合分区(模板)
CREATE TABLE T_MOD_RANGE_HASH
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY RANGE(CREATED) SUBPARTITION BY HASH(OBJECT_TYPE)
SUBPARTITION TEMPLATE
(
SUBPARTITION SP1,
SUBPARTITION SP2,
SUBPARTITION SP3,
SUBPARTITION SP4
)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2012-01-01','YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (MAXVALUE)
)
SQL> SELECT SEGMENT_NAME,PARTITION_NAME FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_MOD_RANGE_HASH';--通过输出可以看出分区的名字变为分区的名字+'_'+子分区
SEGMENT_NAME PARTITION_NAME
--------------------------------------------------------------------------------- ------------------------------
T_MOD_RANGE_HASH P1_SP1
T_MOD_RANGE_HASH P1_SP2
T_MOD_RANGE_HASH P1_SP3
T_MOD_RANGE_HASH P1_SP4
T_MOD_RANGE_HASH P2_SP1
T_MOD_RANGE_HASH P2_SP2
T_MOD_RANGE_HASH P2_SP3
T_MOD_RANGE_HASH P2_SP4
T_MOD_RANGE_HASH P3_SP1
T_MOD_RANGE_HASH P3_SP2
T_MOD_RANGE_HASH P3_SP3
T_MOD_RANGE_HASH P3_SP4
5.范围-列表复合分区(无模板)
CREATE TABLE T_RANGE_LIST
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY RANGE(CREATED) SUBPARTITION BY LIST(OBJECT_TYPE)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD'))
(
SUBPARTITION SP1 VALUES('TABLE'),
SUBPARTITION SP2 VALUES('INDEX')
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))
(
SUBPARTITION SP4 VALUES('TABLE'),
SUBPARTITION SP5 VALUES('INDEX')
),
PARTITION P3 VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION SP6 VALUES('TABLE'),
SUBPARTITION SP7 VALUES('INDEX')
)
)
范围-列表复合分区(带模板)
CREATE TABLE T_MOD_RANGE_LIST
(
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE
)PARTITION BY RANGE(CREATED) SUBPARTITION BY LIST(OBJECT_TYPE)
SUBPARTITION TEMPLATE
(
SUBPARTITION SP1 VALUES('TABLE'),
SUBPARTITION SP2 VALUES('INDEX'),
SUBPARTITION SP3 VALUES('VIEW'),
SUBPARTITION SP4 VALUES('PROCEDURE')
)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2012-01-01','YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (MAXVALUE)
)
SQL> SELECT SEGMENT_NAME,PARTITION_NAME FROM DBA_SEGMENTS WHERE SEGMENT_NAME = 'T_MOD_RANGE_LIST';
SEGMENT_NAME PARTITION_NAME
--------------------------------------------------------------------------------- ------------------------------
T_MOD_RANGE_LIST P1_SP1
T_MOD_RANGE_LIST P1_SP2
T_MOD_RANGE_LIST P1_SP3
T_MOD_RANGE_LIST P1_SP4
T_MOD_RANGE_LIST P2_SP1
T_MOD_RANGE_LIST P2_SP2
T_MOD_RANGE_LIST P2_SP3
T_MOD_RANGE_LIST P2_SP4
T_MOD_RANGE_LIST P3_SP1
T_MOD_RANGE_LIST P3_SP2
T_MOD_RANGE_LIST P3_SP3
T_MOD_RANGE_LIST P3_SP4
二,分区的操作
1.添加新的分区
Range,list增加分区不会影响索引(包括global 跟local),HASH增加分区会让数据重新分配,产生IO,如果不指定update indexes 选项则会导致有数据移动的索引unusable,需要重新编译。
当然,我们说的对索引的影响都是在表中有数据的情况下,没数据当然影响不到索引了
添加新的分区有2中情况:
(1)原分区里边界是maxvalue或者default。 这种情况下,我们需要把边界分区drop掉,在添加上新的分区。
在此以T_RANGE 为例子
SQL> ALTER TABLE T_RANGE DROP PARTITION P8;
表已更改。
SQL> ALTER TABLE T_RANGE ADD PARTITION P8 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'));
表已更改。
(2)没有边界分区的。 这种情况下,直接添加分区就可以了
ALTER TABLE T_RANGE ADD PARTITION P8 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'));
增加子分区
ALTER TABLE T_RANGE_HASH MODIFY PARTITION XX ADD SUBPARTITION XXX
2.删除分区
如果不指定update indexes的话该操作会导致GLOBAL索引失效,而LOCAL不会,因为对应的LOCAL索引分区也被删除了嘛,其他分区的LOCAL不会受到影响。
ALTER TABLE T_RANGE DROP PARTITION xx;
--The concepts of splitting, dropping or merging partitions do not apply to hash partitions. Instead, hash partitions can be added and coalesced.
注意: Hash分区和组合分区的hash子分区 不支持分裂分区,删除或者Merge分区,但是hash分区可以增加和联合。
SQL> ALTER TABLE T_HASH DROP PARTITION P3;
ALTER TABLE T_HASH DROP PARTITION P3
*
第 1 行出现错误:
ORA-14255: 未按范围, 组合范围或列表方法对表进行分区
3.合并分区(coalesce partition)
Alter table xxx coalesce partition [update indexes];
Alter table xxx modify partition p1 coalesce subpartition;
仅适用于HASH分区或子分区,合并一次会减少一个分区(最少能减少到1个),数据重新分配,产生IO,有数据移动的索引失效(如果不指定update indexes的话).
4. 交换分区(exchange partition)
Alter table tb1 exchange partition/subpartition p1 with table tb2;
据说是采用了更改数据字典的方式,所以速度比较快。
可以是分区跟非分区表交换,子分区跟非分区表交换,组合分区跟分区表交换。
例如:
组合分区跟分区表交换:
CREATE TABLE t1 (i NUMBER, j NUMBER)
PARTITION BY HASH(i)
(PARTITION p1, PARTITION p2);
CREATE TABLE t2 (i NUMBER, j NUMBER)
PARTITION BY RANGE(j)
SUBPARTITION BY HASH(i)
(PARTITION p1 VALUES LESS THAN (10)(
SUBPARTITION t2_pls1,
SUBPARTITION t2_pls2
),
PARTITION p2 VALUES LESS THAN (20)(
SUBPARTITION t2_p2s1,
SUBPARTITION t2_p2s2)
);
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1
WITH VALIDATION;
如果指定WITH VALIDATION(默认) 会对交换进来的数据进行合法检查,看是否符合该分区的规则,WITHOUT VALIDATION 会忽略合法检查(比如ID=12的记录此时可以交换到ID VALUES LESS THAN (10)的分区里),但如果表上有primary key 或unique 约束的话,指定without validation会被忽略。
同样,如果不指定UPDATE INDEXES ,GLOBAL 索引会失效,需要重新编译。
5. 合并分区(merge partitions)
Alter table xxx merge partitions/subpartitions p1,p2 into partiton/subpartition p3 [TABLESPACE tablespace_name];
HASH不适用,因为它有COALESCE了嘛。
表分区必须是相邻的。
跟COALESCE一样,会产生IO,数据量大的话,IO也是相当大的。
同样可以用UPDATE INDEXES 避免索引失效
6. 修改LIST分区—ADD VALUES
Alter table xxx modify partition/subpartition p1 add values(7,9);
要注意的是,增加的VALUES不能在其他分区列的VALUES值中存在,也不能在DEFAULT分区(如果有的话)中有相应VALUES.
不会影响索引
7. 修改LIST 分区—DROP VALUES
Alter table xxx modify partition/subpartition p1 drop values(8,9);
同样,删除的values 不能存在记录.
不会影响索引
8. 拆分分区(split partitions)
功能与MERGE PARTITIONS相反。通常我们会用来拆分MAXVALUE/DEFAULT分区。
Range partition:
Alter table xxx split partition/subpartition p1 at (15) into (partition/subpartition p1_new1,partition/subpartition p1_new2);
List partition:
Alter table xxx split partition/subpartition p1 values(15,16) into (partition/subpartition p1_new1,partition/subpartition p1_new2);
原分区中符合新值定义的记录会存入第一个分区,其他存入第二个分区,当然,在新分区后面可以指定属性,比如TABLESPACE。
HASH分区不适用。
会产生IO
同样,可用update indexes 来避免索引失效
9. 截断分区(truncate partition)
跟TRUNCATE TABLE一样,截断该分区内的数据。
Alter table xxx truncate partition/subpartition p1;
同样,可用update indexes 来避免索引失效
10. 移动分区(move partition)
Alter table xxx move partition/subpartition p1 …;
有些功能比如改变分区表空间,modify partition就做不到,此时就可以用move partition来做。
Use the MOVE PARTITION clause of the ALTER TABLE statement to:
Re-cluster data and reduce fragmentation
Move a partition to another tablespace
Modify create-time attributes
Store the data in compressed format using table compression
如:
ALTER TABLE parts MOVE PARTITION depot2
TABLESPACE ts094 NOLOGGING COMPRESS;
(如果指定compress,affects only future storage, but not existing data.)
同样,可用update indexes 来避免索引失效
11. 重命名分区(rename partition)
Alter table xxx rename partition/subpartition p1 to p1_new;
跟重命名表差不多。
12. 修改分区默认属性(modify default attributes)
修改表属性:alter table xxx modify default attributes …
修改分区属性(适用于组合分区):alter table xxx modify default attributes for partition p1 …
只对以后添加的分区产生影响,适用于所有分区,其中hash分区只能修改表空间属性。
如:
Alter table xxx modify default attributes tablespace users;
13. 修改子分区模板属性(set subpartition template)
Alter table xxx set subpartition template (…);
仅影响以后的子分区,当前的子分区属性不会改变
如:
Alter table xxx set subpartition template
(partition p1 tablespace tbs_1,
Partition p2 tablespace tbs_2);
如果要取消掉子分区模板:
Alter table xxx set subpartition template ();
行移动章节
当分区中的分区键值发生update,会导致跨分区的移动。只有启用了行移动时才支持这种情况,否则会产生一个错误。
相关推荐
【Oracle分区表用法】 Oracle分区表是一种高级的数据库管理技术,它将大型表的数据分散存储在不同的物理区域,以提升查询效率和系统的整体性能。本文将详细介绍分区表的概念、作用、优缺点,以及各种类型的分区表...
Oracle分区表是数据库管理系统Oracle中的一个高级特性,用于将大表分成较小、更易管理的部分,从而提高查询性能,优化存储管理和数据维护。在大型企业级应用中,尤其是在处理大量数据时,分区表是不可或缺的技术手段...
Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...
### 导入导出Oracle分区表数据 #### 一、概述 在Oracle数据库管理中,对分区表进行数据的导入与导出是一项常见的任务。分区技术可以显著提高大型表的性能,尤其是在处理大规模数据集时。为了有效地管理和迁移这些...
### Oracle 分区表详解 #### 一、Oracle 分区简介 Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能...
Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...
总结来说,Oracle分区表是一种有效管理大规模数据的手段,通过合理分区,可以显著提升查询效率,简化维护工作,并提供更高的数据可用性。然而,使用分区也需要权衡其带来的复杂性和额外的存储需求。正确理解和应用...
### ORACLE 分区表的创建详解 #### 一、概述 在Oracle数据库中,分区是一种高效的数据管理方式,尤其适用于大型表和索引组织表。通过将数据逻辑地分割成多个独立的部分(即分区),可以显著提高查询性能,并简化表...
Oracle 分区表全揭秘 ,非常详细,oracle dba可以看看
标签“oracle分区表 自动维护”概括了脚本的核心功能和使用场景,说明脚本主要用于Oracle数据库的分区表自动维护。 从提供的部分内容中,我们可以看到脚本的具体实现细节: 1. 创建基础表`PART_T_MAINTENANCE`,...
要查看Oracle分区表的相关信息,可以使用以下视图: 1. `DBA_PART_TABLES`:显示数据库中所有分区表的信息,包括表名、分区类型、分区键等。 2. `ALL_PART_TABLES`:显示当前用户可以访问的所有分区表信息,权限...
#### 一、Oracle分区表概述 在Oracle数据库中,分区是一种对大型表进行物理分割的方法,它可以显著提高查询性能并简化数据管理任务。通过将一个大表分成多个较小的部分(即分区),可以更快地执行查询操作,尤其是...
根据给定的信息“清除oracle分区表数据”,我们将深入探讨如何有效地进行这项操作。 ### 分区表简介 分区是将一个大的表或索引物理地分成多个更小的部分的过程。每个部分(分区)都作为一个独立的对象来处理,这样...
下面我们将深入探讨Oracle分区表和锁的应用。 一、Oracle分区表 1. **分区概念**:Oracle分区表是将一个大表逻辑上划分为多个较小的部分,每个部分称为一个分区。每个分区都有自己的索引和维护操作,这使得对大...
Oracle分区表的简单说明以及举例说明其用法
"Oracle分区表和分区索引在VLDB中的研究" 本文研究了Oracle分区表和分区索引在VLDB(Very Large Databases)中的应用。分区表和分区索引是数据库管理中的关键技术之一,是VLDB中一个重要的性能提升机制。通过分析一...
Oracle分区表是Oracle数据库中的一种高级特性,它允许大型表和索引被划分为更小、更易于管理的部分,称为分区。这些分区可以在物理上存放在不同的表空间中,甚至可以分布在不同的磁盘上。Oracle数据库的分区技术,...
在Unix AIX环境下进行Oracle分区表的备份操作是IT领域中一项重要的技能,尤其是在处理大量数据和维护系统稳定性时。本文将深入解析如何在Unix AIX环境下使用exp工具备份Oracle分区表,包括环境配置、备份策略及恢复...
Oracle 分区表分区索引详解 Oracle 分区表分区索引是 Oracle 数据库中的一种重要机制,它可以提高数据的存储和查询效率。下面将详细介绍 Oracle 分区表分区索引的类型、分类、创建方法和维护方式。 一、分区表和...
Oracle分区表是Oracle数据库中一种优化大数据处理的高级特性,它通过将一个大表分成多个逻辑部分,即分区,来提高查询性能、简化管理和增强可用性。分区技术在处理海量数据时尤其有用,因为它们允许数据库仅扫描与...