创建哈希分区表¶
哈希分区是通过一个哈希函数控制数据行与子分区表间的映射关系。用户可以采用哈希分区将不适于采用范围分区或列表分区的数据进行水平分区。
在以下情况时哈希分区比范围分区更适用:
用户无法事先确定一个分区可能存储的数据量。
各范围分区的容量相差很大,或很难通过人工进行平衡。
采用范围分区可能导致数据不正常的集中。
用户在建表语句CREATE TABLE语句中指定PARTITION BY HASH子句时,即是使用哈希分区方式。其中PARTITION子句可以指定子分区表的名称,PARTITIONS可以指定子分区表的数量。用户还可以使用STORE IN语句为分区表指定表空间,可以指定一个或多个表空间,表空间的个数可以小于子分区表的个数,这个多出的分区表会以第一个表空间为起点,循环分配到表空间中。这只在分区表创建时有效,当分区表创建完毕,添加分区表时,将按正常的继承关系继承表空间。
在采用哈希分区时,应注意以下规则:
- 哈希分区组成分区键的列的个数最多不能超过16个。
- 分区键的列类型不能是以下几种类型:ROWID, LONG, LOB,TIME, ROWID, CLOB, BLOB, TIME, TIME WITH TIME ZONE, TIMESTAMP WITH TIME ZONE, INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH, LPFLOAT, FLOAT(n), VARBI, BIT, VARBINARY, BINARY。
- 哈希分区的子分区表个数最好是2的幂次级,这样有利于数据装载的平衡。
- 当使用individual_hash_partitions时,可以为每个子分区表单独指定表空间及指定partitioning_storage_clause中的表压缩属性。 但使用hash_partitions_by_quantity创建哈希分区时,只能为每个子分区表指定表空间,而不能指定表的压缩属性,子分区表的压缩属性将继承主分区表的压缩属性。
- 当主分区表指定了表空间 A,而子分区表指定了表空间 B,则子分区表的表空间为 B。
- individual_hash_partitions创建子分区表时定义了表空间,当增加子分区表时,子分区表的表空间将继承于主分区表。 用hash_partitions_by_quantity创建的子分区表则相反,增加的子分区表与首次创建的子分区表拥有相同的表空间。
创建哈希分区举例
示例1:系统命名的hash分区表¶
下面的示例创建一个哈希分区表ts_hash。 分区键是id,两个个子分区表的名字由系统自动生成,并分别存储于指定的表空间(ts1 ts2)
-- 清理环境
DROP TABLE ts_hash;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;
-- 创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
-- 创建分区表
CREATE TABLE ts_hash
(
id NUMERIC,
name VARCHAR(60)
)
PARTITION BY HASH (id)
PARTITIONS 2
STORE IN (ts1, ts2);
-- 删除表和表空间
DROP TABLE ts_hash CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;
示例2:指定命名的hash分区表¶
在下面的示例中,为各个子分区表指定了特定的名字和表空间。 并在表级别显式指定物理属性(段初始大小),所有的子分区表将会继承此属性
-- 清理环境
DROP TABLE ts_hash;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;
-- 创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
-- 创建分区表
CREATE TABLE ts_hash
(
id NUMERIC,
name VARCHAR(32)
)
STORAGE (INITIAL 64K)
PARTITION BY HASH(id)
(
PARTITION p1 TABLESPACE ts1,
PARTITION p2 TABLESPACE ts2
);
-- 删除表和表空间
DROP TABLE ts_hash CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;