Oracle分区表详解:
范围分区
范围分区根据您为每个分区建立的分区键值的范围将数据映射到分区。它是最常见的分区类型,通常与日期一起使用。例如,您可能希望将销售数据分区为每月分区。
使用范围分区时,请考虑以下规则:
每个分区都有一个VALUES LESS THAN子句,它指定了分区的不包含的上限。等于或高于此文字的分区键的任何值都将添加到下一个更高的分区。
除第一个以外,所有分区都具有由VALUES LESS THAN先前分区上的子句指定的隐式下限。
甲MAXVALUE字面可以为最高分区来定义。MAXVALUE表示比分区键的任何其他可能值更高的虚拟无限值,包括空值。
以下部分给出了一个典型的例子。该语句创建一个sales_range在该sales_date字段上进行范围分区的table()。
https://www.cndba.cn/redhat/article/2304
范围分区的典型例子:
CREATE TABLE sales_range
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY RANGE(sales_date)
(
PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE(‘02/01/2000’,’MM/DD/YYYY’)),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE(‘03/01/2000’,’MM/DD/YYYY’)),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE(‘04/01/2000’,’MM/DD/YYYY’)),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE(‘05/01/2000’,’MM/DD/YYYY’))
);
https://www.cndba.cn/redhat/article/2304
列表分区
列表分区使您能够明确地控制行映射到分区的行为。
您可以通过在每个分区的说明中指定分区键的离散值列表来执行此操作。
这与范围分区不同,其中一系列值与分区和散列分区相关联,其中哈希函数控制行到分区映射。
列表分区的优点是您可以以自然的方式对无序和无关的数据集进行分组和组织。
列表分区的细节可以用一个例子来描述。在这种情况下,假设您要按地区划分销售表。
这意味着根据其地理位置将状态分组在一起,如下例所示。
列出分区示例:
CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES(‘California’, ‘Hawaii’),
PARTITION sales_east VALUES (‘New York’, ‘Virginia’, ‘Florida’),
PARTITION sales_central VALUES(‘Texas’, ‘Illinois’),
PARTITION sales_other VALUES(DEFAULT)
);
scott@QHPRI>desc sales_list;
Name Null? Typehttps://www.cndba.cn/redhat/article/2304
SALESMAN_ID NUMBER(5)
SALESMAN_NAME VARCHAR2(30)
SALES_STATE VARCHAR2(20)
SALES_AMOUNT NUMBER(10)
SALES_DATE DATE
insert into sales_list values (100,’anshen’,’California’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’New York’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Virginia’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’Florida’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’Texas’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Illinois’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’Texas’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’Florida’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Illinois’,101,’05-JAN-2017’);
insert into sales_list values (100,’anshen’,’California’,100,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list values (101,’anshen’,’taiwan’,101,’05-JAN-2017’);
通过检查行的分区列的值是否落在描述分区的值集合内,将一行映射到分区。例如,行如下插入:
(10,’Jones’,’Hawaii’,100,’05-JAN-2017’)映射到分区sales_west
(21,’Smith’,’Florida’,150,’15-JAN-2017’)映射到分区sales_east
(32,’Lee’,’Colorado’,130,’21-JAN-2017’)映射到分区sales_other
与范围和散列分区不同,列分区不支持多列分区密钥。如果表由列表分区,则分区键只能由表的单列组成。
该DEFAULT分区使您能够避免使用默认分区指定列表分区表的所有可能值,以便不映射到任何其他分区的所有行都不会生成错误。
列表分区就是列出某一列所有的字段值,然后根据字段值进行数据选址DML操作。
CREATE TABLE sales_list_test
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES(‘California’, ‘Hawaii’),
PARTITION sales_east VALUES (‘New York’, ‘Virginia’, ‘Florida’),
PARTITION sales_central VALUES(‘Texas’, ‘Illinois’)
);
insert into sales_list_test values (100,’anshen’,’California’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’New York’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Virginia’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’Florida’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’Texas’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Illinois’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’Texas’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’Florida’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Illinois’,101,’05-JAN-2017’);
insert into sales_list_test values (100,’anshen’,’California’,100,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’Hawaii’,101,’05-JAN-2017’);
接下来,我们插入一个在list 分区中不存在的一个字段的值,taiwan。
insert into sales_list_test values (101,’anshen’,’taiwan’,101,’05-JAN-2017’);
scott@QHPRI>insert into sales_list_test values (101,’anshen’,’taiwan’,101,’05-JAN-2017’);
insert into sales_list_test values (101,’anshen’,’taiwan’,101,’05-JAN-2017’)
*
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition
散列分区
哈希分区可以轻松分割不适用于范围或列表分区的数据。它使用简单的语法来实现,并且易于实现。当以下情况时,它比范围分区更好:
您事先不知道有多少数据映射到给定范围内
范围分区的大小将相当显着或将难以手动平衡
范围划分将导致数据不合需要地聚集
性能特征如并行DML,分区修剪和分区连接很重要
分割,删除或合并分区的概念不适用于哈希分区。相反,哈希分区可以添加和合并。https://www.cndba.cn/redhat/article/2304https://www.cndba.cn/redhat/article/2304
CREATE TABLE sales_hash
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4
STORE IN (ts1, ts2, ts3, ts4);https://www.cndba.cn/redhat/article/2304
https://www.cndba.cn/redhat/article/2304
CREATE TABLE sales_hash_test1
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 5
STORE IN (ts1, ts2, ts3, ts4);
CREATE TABLE sales_hash_test10
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 10
STORE IN (ts1, ts2, ts3, ts4);
前面的语句创建一个表sales_hash,它是salesman_id字段上的哈希分区。表空间名称ts1,ts2,ts3,和ts4。使用这种语法,我们确保在指定的表空间中以循环方式创建分区。
哈希分区不用指定PARTITION_NAME 系统创建。
scott@QHPRI>select TABLE_OWNER,TABLE_NAME,COMPOSITE,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME,USER_STATS,INTERVAL from dba_tab_partitions where TABLE_OWNER=’SCOTT’ and TABLE_NAME=upper(‘sales_hash_test10’);
TABLE_OWNER TABLE_NAME COM PARTITION_NAME SUBPARTITION_COUNT TABLESPACE_NAME USE INThttps://www.cndba.cn/redhat/article/2304
SCOTT SALES_HASH_TEST10 NO SYS_P85 0 TS1 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P86 0 TS2 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P87 0 TS3 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P88 0 TS4 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P89 0 TS1 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P90 0 TS2 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P91 0 TS3 NO NO
TABLE_OWNER TABLE_NAME COM PARTITION_NAME SUBPARTITION_COUNT TABLESPACE_NAME USE INThttps://www.cndba.cn/redhat/article/2304
SCOTT SALES_HASH_TEST10 NO SYS_P92 0 TS4 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P93 0 TS1 NO NO
SCOTT SALES_HASH_TEST10 NO SYS_P94 0 TS2 NO NO
10 rows selected.
Elapsed: 00:00:00.05
当然我们创建分区也可以指定分区名字:如下
create table hash_table(
obj_id number(10),
object_id number(10),
object_name varchar2(128),
owner varchar2(30),
object_type varchar2(19),
created date)
partition by hash(object_id)
(
partition h_objid1 tablespace ts1 ,
partition h_objid2 tablespace ts2,
partition h_objid3 tablespace ts3,
partition h_objid4 tablespace ts4
) ;
scott@QHPRI>select TABLE_OWNER,TABLE_NAME,COMPOSITE,PARTITION_NAME,SUBPARTITION_COUNT,TABLESPACE_NAME,USER_STATS,INTERVAL from dba_tab_partitions where TABLE_OWNER=’SCOTT’ and TABLE_NAME=upper(‘hash_table’);
TABLE_OWNER TABLE_NAME COM PARTITION_NAME SUBPARTITION_COUNT TABLESPACE_NAME USE INT
SCOTT HASH_TABLE NO H_OBJID1 0 TS1 NO NO
SCOTT HASH_TABLE NO H_OBJID2 0 TS2 NO NO
SCOTT HASH_TABLE NO H_OBJID3 0 TS3 NO NO
SCOTT HASH_TABLE NO H_OBJID4 0 TS4 NO NO
Elapsed: 00:00:00.03https://www.cndba.cn/redhat/article/2304
版权声明:本文为博主原创文章,未经博主允许不得转载。
Oracle分区表详解: