目的:
————
该文章的目的是讨论高级分区表的问题并且提供分区操作例子。
1、 创建分区表
Range Interval Hash List Reference Composite Range-range (*11g specific) Range-hash Range-list List-range(*11g specific) List-hash(*11g specific) List-list(*11g specific) System Partitioning 2、分区表的维护操作
添加分区
丢弃分区
交换分区
合并分区
移动分区
重命名分区
分裂分区
截断分区
3、常见错误/不正确的产品使用
4、分区表BUG
介绍
————
在ORACLE 8i中有三种类型的分区表:Range, Hash and Composite, Range分区表需通过“分区键”来确定下一个预定义范围的值。一个列的“分区键”的值决定了一个行所属的分区。
一个哈希分区表的行物理位置由哈希值的应用到分区键列所决定的,提供了决策,在物理层上均匀分布数据。
混合分区是基本数据分布方式的结合:一个表由一个数据分配方法分区并且每个分区再进一步被细分为子分区使用另外一种数据分布方式。
一个给定的分区中的所有个子代表了数据的逻辑子集。
Oracle9i中增加了一个新的分区模型,称为列表分区,设置在Oracle RDBMS中已经被支持的分区方法。新的列表方法提供了明确的控制关于行如何映射到分区通过每个分区分区列一系列指定的不连续的值。当你希望指定一些基于不连续值的映射行到分区,你应该用列表分区。
ORACLE 11g 已经增加了更多的分区方法。间隔分区是范围分区的一种扩展,它指导数据库自动的创建之间间隔的分区当数据插入到表超过了所有的范围分区。参照分区可以让你将一个表基于表参照的约束分区方案分区。系统分区可以让应用程序控制任相应的分区。
1、创建分区表
使用范围分区的方法
———
范围分区映射行到分区上是基于一列值的范围。这个分区方式最适用于处理那些有逻辑范围分布的数据。例如,年的月份或者是数字的值。当这些数据均匀的分布在范围之内,性能是最好的。如果范围分区使得分区大小明显的不同因为数据的不均匀分布,那么你可以考虑一个其他的分区方式。
当创建范围分区,你必须用指定"RANGE"方法,和RANGE中的分区列,和分区分界。
如何创建范围分区的,参看:
Note:164874.1 Example of Script to Create a Range Partition Table. 如何插入一个范围分区表,参看:
Note: 165303.1. Examples of Inserting into Range Partitioned Tables. 使用哈希分区的方法
当数据不能很好的加载到范围分区时,除非你想区分性能原因,哈希分区是最好的选择。哈希分区可以在指定数量的的分区内平均的分布数据。行被映射到分区基于分区键的哈希值。
当创建哈希分区,你必须指定“HASH”方法,分区列为HASH,和分区数量或者单个分区说明。
为了使行在哈希分区表中相对均匀的分布,必须满足这两个要求:
分区的数目是2的乘方。
分区键是连续的或者接近于连续的。
如何创建哈希分区表的一个例子,参看:
Note:164873.1 Example of Script to Create a Hash Partition Table. 使用混合分区表的方法
——
在之前的版本中,混合分区方法仅支持范围—列表、范围—哈希的混合方式。在ORACLE 数据库11g中,列表分区可以成为高级分区分区方法,混合分区包括了列表—列表、列表—哈希、列表—范围和范围—范围混合方式。于间隔分区,还支持一下的混合分区方法:
间隔—范围、间隔—列表和间隔—哈希。
*范围—范围分区:范围—范围分区能够使逻辑范围分区按照两种尺寸分区,例如:分区按order_date,范围子分区按shipping_date.分区。
*列表—范围分区:列表—范围分区能够使逻辑范围分区子分区在给定的分区策略;例如,列表分区用country_id,子分区用order_date
*列表—哈希分区:列表—哈希分区可以使列表分区的对象为哈希子分区,例如,可以加入只能化分区
*列表—列表分区:列表—列表分区可以使得逻辑列表分区使用两种尺度;例如,列表分区按country_id,列表子分区按sales_channel.
如何创建混合分区表的一个例子,参看:
Note:165924.1 Example of Script to Create a Composite Partition Table Note:452447.1 11g Partitioning Enhancements 使用列表分区的方法
——
列表分区是一种新的分区方式在ORACLE9i中被介绍。
可以让我们控制行是如何映射到分区的。它允许基于不连续的列值分布数据。无顺序和连续的数据集可以被组织到一起。因为分区间是没有联系的这种方法可以用于处理一些不连续值的列;它同时提供了强大的数据管理能力。
功能用法
目前只支持簇表
多列分区是不支持的
指定的文字值必须在所有分区值列表对象的所有文字值中是唯一的。
NULL可以被指定为一个分区的文字值。
MAXVALUE不能指定。
所有列出了必须有至少一个文本。
支持分区修整,分区智能加入,和并行
支持本地索引和全局范围分区索引
当创建一个列表分区,你必须指定方法为“LIST”,分区列为LIST,和分区说明
对于引进新的分区方法列表分区,请参阅:
Note:149116.1 Oracle9i Partitioning Enhancements,LIST Partitioning 使用间隔分区的方法
——
在11g中的介绍,间隔分区是范围分区的扩展。间隔分区解决了当一个指定的范围被开发者或者DBA为表创建了一个分区。间隔分区解决了范围分区的局限性问题,当开发者或者DBA在一个未知的指定范围内为表创建分区。
ORACLE自动创建一个分区当插入的值超过了所有其他的分区范围,这是对范围分区一个有益的补充。
由于这样的要求使然,间隔分区需要调用至少一个指定的范围分区。一旦为范围分区给定了的范围分区键,该转换点将被用作创建间隔分区的基线。
获取更多的关于间隔分区的信息,参考:
Note:757754.1 Interval Partitioning By Week 使用参考分区的方法
在11g的介绍中,参考分区使得对一个表分区可以基于表参照的参考约束的分区方案。
*表分区可以基于表参照的参照约束的分区方法。
*拥有父/子关系的表可以等分区通过从父表继承不重复的分区键列分区键
*如果父表是一个混合分区表,那么该表将对应在它父表每个子分区中有一个分区。
要获得更多的关于参照分区的信息,请参阅:
Note:467019.1 11g Feature: Reference Partitioning 使用系统分区的方法
——
系统分区方法和其他分区方法最本质的区别就是系统分区没有任何的分区键,所以将行映射到特定的分区是不隐式的。取而代之的是,你要制定分区给行映射通过使用分区扩展语法当插入一行时。
没有了分区键,系统分区表上将不能体现分区表通常的性能优势。它不支持传统的分区或者智能分区加入。在访问相同分区的系统分区表才能实践分区修整,因为那些是访问的基本表。
系统分区表提供易于管理的的等分区。例如,一个嵌套表可以被创建为系统分区表拥有相同数量的分区作为基表。一个有着相同数量分区作为基表的域索引可以被系统分区表备份。
更多的关于参照分区的信息,请参看:
Note:452447.1 11g Partitioning Enhancements 2、分区表的维护操作
添加一个范围、哈希、混合分区或者混合子分区
ALTER TABLE...ADD PARTITION命令让你在最后一个分区之外添加一个额外的分区,只要上限不等于MAXVALUE.如果相等,那么添加分区将是不可能的。如果你希望在表的开始或者是中间添加一个分区,或者如果最高的分区分区边界是MAXVALUE,你将另外使用SPLIT PARTITION语句。当最高分区的分区边界比MAXVALUE高,你可以添加一个分区使用ALTER TABLE...ADD PARTITION语句。
你可以增加分区到范围、哈希、或者混合分区表。你可以只添加子分区到一个混合分区表。
增加一个分区到范围—分区表
——
你可以使用ALTER TABLE...ADD PARTITION子句来增加新的分区给“high”尾部(最后一个存在分区的点)。如果你想在表的开始或者是中间增加一个分区,使用SPLIT PARTITION子句。
例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table 增加索引分区
——
你不能明确的添加一个分区到本地索引。取而代之的是,新分区被添加到本地索引只有当你增加一个分区到下面的表。
当有本地索引被定义到表上并且你执行了ALTER TABLE...ADD PARTITION子句,一个匹配的分区也将被添加到本地索引中。由于ORACLE为新的索引分区指派名字和默认的物理存储空间,你可能希望重命名或者修改它们在ADD操作完成之后。
增加一个分区不会影响本地或者全局索引。如果表拥有一个本地索引,所有本地索引分区将会是USABLE状态。任何全局索引,或者所有分区全局索引分区将仍然是USABLE状态。
——
联合分区
COALESCE可以考虑用于替换MERGE分区选项,但它是不支持哈希分区的。联合分区是减少哈希分区表分区数量的一种方式,或者是混合分区表子分区的数量。当一个哈希分区被合并,它的内容将被重新分配到一个或者多个其他分区,由哈希分区功能所决定。数据库将选中被合并的指定分区,并且在它内容重新分配之后删除掉它。
任何被选中的分区相应的本地索引分区将一同被丢弃,选择分区对应的本地索引分区将被标记UNUSABLE,并且必须被重建。任何全局索引都被标记unusable。
联合哈希分区表的一个分区
——
ALTER TABLE...COALESCE PARTITION子句用于合并哈希分区表的一个分区。
合并混合分区表的一个子分区
例子:
Note:93767.1 New 8.1.X coalesce partition/subpartition option of the ALTER TABLE 命令
——
丢弃分区
你可以丢弃分区重一个范围或者是混合分区表中。哈希分区表或者是混合分区表的哈希子分区,
你必须执行一个合并操作来代替。
使用ALTER TABLE...DROP PARTITION 子句去丢弃一个表分区从一个范围或者是混合分区表中。如果你希望保留先前的数据在分区中,你应该将数据merge到邻近的一个分区中。
如果该表定义有本地索引,该语句也将丢弃匹配的分区或者是子分区从本地索引中。表中任何全局非分区索引将被标记UNUSABLE,并且所有全局分区索引的分区将被标记 UNUSABLE,除非该分区被丢弃或者是它的子分区是空的。
从表中丢弃一个分区的例子。
Note:166652.1 Example of Script to Maintain Range Partitioned Table 丢弃索引分区
——
你不能明确的丢弃一个本地索引的分区。取而代之,本地索引分区被丢弃只当你丢弃一个分区从所属表中。
——
交换哈希分区或者是范围分区
关于索引的说明:在交换分区之后,全局索引将需要重建。如果INCLUDING INDEXES子句被用于交换中,本地索引将会与相应的常规索引交换。如果EXCLUDING INDEXES子句被使用,所有的本地索引分区相对应的分区和在交换表上所有的常规索引将被标记unusable并且将被重建。
交换哈希或者范围分区
——
用非分区表交换一个范围或者哈希分区表的一个分区,或者相反的操作,你使用ALTER TABLE...EXCHANGE PARTITION 子句。
如何用范围分区表交换非分区表的一个例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table Note:1070693.6 How to partition a non-partitioned table 合并分区
使用ALTER TABLE...MERGE PARTITIONS合并两个毗邻范围分区表的内容到一个分区。结果是该分区获得了比两个合并分区更高的边界上限。两个原始分区被丢弃,连同对应的对应的本地索引。表上任何全局非分区索引将被标记UNUSABLE,并且所有的全局索引分区的分区将被标记UNUSABLE,如果分区被合并且不为空。
除非相关分区或者是子分区是空的,ORACLE也讲标记对应的本地索引分区或者是子分区为 UNUSABLE.
你不可以使用该语句在哈希分区表或者是混合分区表的子分区。但是你可以使用COALESCE讨论上述情况
合并范围分区
——
例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table —— 移动分区
你可以使用在 ALTER TABLE语句中使用MOVE PARTITION子句来重新组织数据并且减少碎片,移动一个分区到另一个表空间,或者修改创建时间属性。
当你移动的分区包含数据时,MOVE PARTITION 在每个本地索引中标记匹配的分区,和所有的的全局索引分区是unusable.你必须重建这些索引分区在执行MOVE PARTITION之后。全局索引页必须重建。
你可以重建整个索引通过分别重建每一个分区实用ALTER INDEX...REBUILD PARTITION子句。你现在就可以执行这些重构。你也可以简单的丢弃索引并且重构它。
如果分区不为空,MOVE PARTITION标记所有相应的本地索引分区,所有全局非分区索引,和所有的全局分区索引的分区,为 UNUSABLE.
限制:
你不可以MOVE整个分区表(无论是簇或者是索引组织的)你必须移动单独的分区或者是子分区。
如果一个分区是哈希分区,在该子句中你唯一可以指定的属性TABLESPACE.
你不能移动一个混合分区表的分区。你必须使用move子分区子句来分别移动每一个子分区。
你不能在一个包含子分区的分区使用该子句(MOVE PARTITION)。但是你可以使用move子分区移动子句来移动子分区。
移动分区
——
例子
Note:166652.1 Example of Script to Maintain Range Partitioned Table 移动一个子分区
——
你可以使用移动子分区子句来移动表的子分区到另一个段中。如果你不指定 TABLESPACE,子分区将保留在相同的表空间中。
除非子分区是空的,ORACLE将标记所有的相应的本地索引分区,所有全局非分区索引,和全局分区索引分区,标记为UNUSABLE.
重命名分区
你可以使用重命名分区选项去重命名一个表分区或者是子分区。对于分区和子分区,新的名称,必须从同一个表中的所有现有分区和子分区的不同。
例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table —— 分割一个范围或者索引分区
ALTER TABLE 或者 ALTER INDEX 语句的SPLIT PARTITION子句被用于重新在分配一个分区的内容到两个新的分区。您可能要这样做,当一个分区变得太大,导致备份,恢复或维护操作需要很长的时间来完成。你也可以使用SPLIT PARTITION子句来重新组织I/O负载。
split_partition_clause 让你创建、组织一个原始的分区
partition_name_old 两个分区,每个拥有一个新段和新的物理属性,和新的初始区
partition_name_old 丢弃
如果分割的分区包含数据,ALTER TABLE...SPLIT PARTITION 语句将在每个本地索引新分区标记UNUSABLE,所有的全局索引分区,和任何的全局非分区索引。你必须重建这样的相关索引或者是索引分区。
该子句不能用于哈希分区或者是子分区
分割一个范围分区
——
例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table 分割索引分区
——
你不可以直接的分割一个本地索引。一个本地索引分区被分割只当你分割一个分区在相应的表中。
——
截断分区
TRUNCATE PARTITION 从一个分区中删除所有的的行,或者如果是混合分区表,所有的行都来自子分区。TRUNCATE SUBPARTITION将从子分区删除所有的行。
如果表包含任何的 LOB 列,该分区的LOB数据和LOB索引段将被截断。如果表是混合分区,该分区子分区的LOB数据和LOB索引段将被截断。
如果被截断的分区或者子分区包含数据,你必须首先关闭表上的完全参照约束。或者你可以删除行然后再截断分区。
对于每个分区或者是子分区截断,ORACLE也会截断对应的本地索引分区和子分区。如果那些索引分或子分区被标记UNUSABLE,ORACLE 截断他们并且重新设置UNUSABLE 标记为 VALID。另外如果截断分区或者子分区,或者任何截断分区的子分区不为空,ORACLE将所有的全家分分区索引和表上定义的全局索引分区标记为UNUSABLE。
DROP STORAGE-Specify DROP STORAGE 重新分配空间从删除的行并且使它对表空间中其他方案对象可用。
REUSE STORAGE-Specify REUSE STORAGE 把删除行的空间分配给分区或子分区。该空间只用于相同分区或者子分区的插入和更新动作。
例子:
Note:166652.1 Example of Script to Maintain Range Partitioned Table --------- 3、 常见错误/不正确用法
ORA-14099 Exchanging a Partition Note:135762.1 ORA-14080 Splitting a Partition Note:100299.1 ORA-14074 Adding a New Table Partition Note:100295.1 -------------------------------------------------------------------------------- 4、 分区表BUG
Note:165510.1讨论客户一般常见已被确认的BUG当使用分区表功能时,如果没有匹配的错误,我们会提供一种解决方法,如果错误被确定。
相关文档
----------------- Note:93767.1 New 8.1.X coalesce partition|subpartition option of the ALTER TABLE command Note:105317.1 How to Implement Partitioning in Oracle Versions 8 and 8i Note:1070693.6 How to partition a non-partitioned table Note:90987.1 Oracle 8i New Feature: Composite-Partitioned Table Exchange Enhancement Note:47966.1 8.0 FAQ: Oracle8 Partitions Note:165309.1 Top Partitioned Indexes Issues Note:166215.1 Top Partition Performance Issues Note:165510.1 Partition Table Bugs Note:135762.1 ORA-14099 Using Exchange Partition Option: Oracle 8.x Note:100299.1 ORA-14080 when trying to Split a Partition. Note:100295.1 8.X ORA-14074 Received when Adding a New Table Partition Note:757754.1 Interval Partitioning By Week Note:452447.1 11g Partitioning Enhancements Note:467019.1 11g Feature: Reference Partitioning Oracle8 and Oracle8i Concepts Guide Oracle8 and Oracle 8i SQL Reference 其他搜索词
------------------------ PARTITION; PARTITIONING;
|