深入学习分区表及分区索引(详解oracle分区)

合集下载

Oracle 分区的概念

Oracle  分区的概念

Oracle 分区的概念分区是指将巨型的表或索引分割成相对较小的、可独立管理的部分,这些独立的部分称为原来表或索引的分区。

分区后的表与未分区的表在执行查询语句或其他DML语句时没有任何区别,一旦进行分区之后,还可以使用DDL语句对每个单独的分区进行操作。

因此,对巨型表或者索引进行分区后,能够简化对它们的管理和维护操作,而且分区对于最终用户和应用程序是完全透明的。

在对表进行分区后,每一个分区都具有相同的逻辑属性。

例如,各个分区都具有相同的字段名、数据类型和约束等。

但是各个分区的物理属性可以不同,例如,各个分区可以具有不同的存储参数,或者位于不同的表空间中。

如果对表进行了分区,表中的每一条记录都必须明确地属于某一个分区。

记录应当属于哪一个分区是记录中分区字段的值决定的。

分区字段可以是表中的一个字段或多个字段的组合,这时在在创建分区表时确定。

在对分区表执行插入、删除或更新等操作时,Oracle会自动根据分区字段的值来选择所操用的分区。

分区字段由1~16个字段以某种顺序组成,但不能包含ROWID等伪列,也不能包含全为NULL值的字段。

图10-1显示了一个典型的分区表。

通常在对表进行分区时也会将地对应的索引进行分区,但是未分区的表可以具有分区的索引,而分区的表也可以具有未分区的索引。

索引索引索引索引5月6月7月未分区的表(分区的索引)分区的表(分区的索引)图10-1 分区表与分区索引一个表可以被分割成任意数目的分区,但如果在表中包含有LONG或LONG RAW类型的字段,则不能对表分区。

对于索引组织表而言,虽然也可以分区,但是有如下一些限制:●索引组织表仅支持范围和散列分区,不能以列表或复合方式对索引组织表进行分区。

●分区字段必须是主键字段的一个子集。

●如果在索引组织表中使用了OVERFLOW子句,溢出存储段将随表的分区进行相同的分割。

下面给出了应当考虑对表进行分区的一些常见情况:●如果一个表的大小超过了2GB,通常会对它进行分区。

Oracle 分区索引和全局索引

Oracle  分区索引和全局索引

Oracle 分区索引和全局索引对于分区表而言,每个表分区对应一个分区段。

当在分区表上建立索引时,即可以建立全局索引,也可以建立分区索引。

对于合局索引,其索引数据会存放在一个索引段中;而对于分区索引,则索引数据都会被存放到几个索引分区段中。

对索引进行分区的目的与对表进行分区是一样的,都是为了更加易于管理和维护巨型对象。

在Oracle中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。

1.本地分区索引本地分区索引是为分区表中的各个分区单独地建立分区,各个索引分区之间是相互独立的。

本地分区索引相对比较简单,也比较容易管理。

图10-4显示了本地分区索引和分区表之间的对应关系:分区索引分区表图10-4 本地分区索引与分区表在为分区表创建本地索引后,Oracle会自动对表的分区和索引的分区进行同步处理。

如果为分区表添加新的分区后,Oracle会自动为新分区建立新的索引。

与此相反,如果表的分区依然存在,则用户将不能删除它所对应用的索引分区。

在删除表的分区时,系统会自动删除所对应的索引分区。

例如,下面的语句为范围分区表SALES_RANGE创建本地分区索引:SQL> create index sales_local_idx2 on sales_range(customer_id) local;索引已创建。

2.全局分区索引全局分区索引是对整个分区表建立的索引,然后再由Oracle对索引进行分区。

全局分区索引的各个分区之间不是相互独立的,索引分区与分区表之间也不是简单的一对一关系。

图10-5显示了全局分区索引与分区表的对应关系。

分区索引分区表图10-5 全局分区索引与分区表例如,下面的语句为分区表SALES_LIST创建全局分区索引:SQL> create index sales_global_part_idx2 on sales_list(customer_id)3 global partition by range(customer_id)4 (5 partition part1 values less than(300) tablespace space01,6 partition part2 values less than(maxvalue) tablespace space027 );索引已创建。

oracle partition用法

oracle partition用法

oracle partition用法Oracle Partition是Oracle数据库中的一项功能,允许将表或索引分割成多个逻辑分区,这样可以更好地管理和维护大型数据集。

使用Oracle Partition的好处包括:1. 提高查询性能:根据分区键,Oracle可以只查询特定分区上的数据,而不需要扫描整个表。

这样可以显著减少查询时间,提高查询性能。

2. 支持更有效的数据维护:可以对特定分区进行数据加载、删除、备份和恢复,而不会影响其他分区。

这样可以加快数据维护的速度,并且减少维护操作对整个表的影响。

3. 改善数据安全性和可用性:可以将不同的分区存储在不同的存储介质上,例如将热数据存储在高性能存储中,将冷数据存储在低成本存储中。

这样可以根据数据的访问模式和重要性进行优化,提高数据安全性和可用性。

使用Oracle Partition时,需要定义分区策略和分区键。

分区策略定义如何将表或索引分割成多个分区,例如按范围、按列表或按哈希等方式进行分割。

分区键则是定义用于分割的列或表达式,根据这个键的值将数据放入不同的分区中。

以下是一个创建分区表的示例:CREATE TABLE sales(sale_id NUMBER,product VARCHAR2(50),sale_date DATE,amount NUMBER)PARTITION BY RANGE (sale_date)(PARTITION sales_q1 VALUES LESS THAN (TO_DATE('01-APR-2021', 'DD-MON-YYYY')),PARTITION sales_q2 VALUES LESS THAN (TO_DATE('01-JUL-2021', 'DD-MON-YYYY')),PARTITION sales_q3 VALUES LESS THAN (TO_DATE('01-OCT-2021', 'DD-MON-YYYY')),PARTITION sales_q4 VALUES LESS THAN (TO_DATE('01-JAN-2022', 'DD-MON-YYYY')));这个示例中,sales表被按照销售日期进行范围分区,分成了四个分区sales_q1、sales_q2、sales_q3和sales_q4。

oracle索引原理详解

oracle索引原理详解

oracle索引原理详解Oracle数据库中的索引是用于提高数据检索速度的重要工具。

了解Oracle索引的原理对于数据库管理员和开发人员来说是非常重要的。

一、索引的基本概念索引是Oracle数据库中的一个对象,它可以帮助数据库系统更快地检索数据。

索引类似于书籍的目录,可以快速定位到所需的数据。

二、索引的分类1. B-Tree索引:这是Oracle中最常用的索引类型,基于平衡多路搜索树(B-Tree)实现。

B-Tree索引适用于大多数数据类型,包括字符、数字和日期等。

2. Bitmap索引:位图索引主要用于处理包含大量重复值的列。

通过位图索引,可以更高效地处理这些列的查询。

3. 函数基索引:函数基索引允许在列上应用函数,然后对该结果进行索引。

这可以用于优化包含函数操作的查询。

4. 反转键索引:反转键索引是一种特殊类型的B-Tree索引,用于优化插入操作。

通过反转键顺序,可以更高效地处理插入操作。

三、索引的创建和维护1. 创建索引:创建索引的基本语法是“CREATE INDEX index_name ON table_name (column_name)”。

其中,index_name是索引的名称,table_name是要创建索引的表名,column_name是要索引的列名。

2. 维护索引:定期维护索引可以确保其性能和可靠性。

常用的维护操作包括重建索引(REBUILD INDEX)和重新组织索引(ORGANIZE INDEX)。

四、索引的优点和缺点1. 优点:使用索引可以显著提高数据检索速度,减少查询时间。

此外,索引还可以用于优化复杂查询的性能。

2. 缺点:虽然索引可以提高性能,但它们也会占用额外的磁盘空间。

此外,当表中的数据发生变化时,索引也需要更新,这可能会影响写操作的性能。

五、最佳实践1. 在经常用于搜索和排序的列上创建索引。

2. 根据查询模式和数据分布选择合适的索引类型。

3. 定期分析和维护索引,确保其性能和可靠性。

Oracle索引详解

Oracle索引详解

一.索引介绍1.1 索引的创建语法:CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>ON <schema>.<table_name>(<column_name> | <expression> ASC | DESC,<column_name> | <expression> ASC | DESC,...)TABLESPACE <tablespace_name>STORAGE <storage_settings>LOGGING | NOLOGGINGCOMPUTE STATISTICSNOCOMPRESS | COMPRESS<nn>NOSORT | REVERSEPARTITION | GLOBAL PARTITION<partition_setting>相关说明1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。

2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression 时即“基于函数的索引”3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)4)STORAGE:可进一步设置表空间的存储参数5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)6)COMPUTE STATISTICS:创建新索引时收集统计信息7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区1.2 索引特点:第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

ORACLE分区表、分区索引详解

ORACLE分区表、分区索引详解

ORACLE分区表、分区索引详解ORACLE分区表、分区索引ORACLE对于分区表⽅式其实就是将表分段存储,⼀般普通表格是⼀个段存储,⽽分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在那个分区或那⼏个内部,然后在分区内部去查找数据,⼀个分区⼀般保证四⼗多万条数据就⽐较正常了,但是分区表并⾮乱建⽴,⽽其维护性也相对较为复杂⼀点,⽽索引的创建也是有点讲究的,这些以下尽量阐述详细即可。

1、类型说明:range分区⽅式,也算是最常⽤的分区⽅式,其通过某字段或⼏个字段的组合的值,从⼩到⼤,按照指定的范围说明进⾏分区,我们在INSERT数据的时候就会存储到指定的分区中。

List分区⽅式,⼀般是在range基础上做的⼆级分区较多,是⼀种列举⽅式进⾏分区,⼀般讲某些地区、状态或指定规则的编码等进⾏划分。

Hash分区⽅式,它没有固定的规则,由ORACLE管理,只需要将值INSERT进去,ORACLE会⾃动去根据⼀套HASH算法去划分分区,只需要告诉ORACLE要分⼏个区即可。

分区可以进⾏两两组合,ORACLE 11G以前两两组合都必须以range作为⼀级分区的开头,ORACLE⽬前最多⽀持2级别分区,但这个级别已经够我们使⽤了。

我这只以最简单的分区⽅式创建分区来说明问题,就拿range分区来说明问题吧(基本创建语句如下):CREATE [url=]TABLE[/url] TABLE_PARTITION(COL1 NUMBER,COL2 VARCHAR2(10))partition by range(COL1)(partition TAB_PARTOTION_01 values less than (450000),partition TAB_PARTOTION_02 values less than (900000),partition TAB_PARTOTION_03 values less than (1350000),partition TAB_PARTOTION_04 values less than (1800000),partition TAB_PARTOTION_OTHER values less THAN (MAXVALUE));这个分区表创建了四个定长分区,理想情况下,存储450000条数据,扩展分区是超过这个数额的分区,当发现扩展分区有数据的时候,可以进⾏将扩展分区做SPLIT操作,这个后⾯说明,这⾥先说⼀下⼀些常⽤的分区表查询功能,我们先插⼊⼀些数据进去。

Oracle的临时表、分区表、分区索引

Oracle的临时表、分区表、分区索引

Oracle的临时表一、表的种类1:永久表:非私有数据,需要DML锁。

2:临时表:临时表的定义对所有会话都是可见的,处理事务或会话期存在的私有数据,不需要DML锁,对于临时表的DML语句不生成重做日志,临时表占用临时表空间,临时表的数据是自动删除的,在临时表上建的索引也是临时的。

二、临时表的种类1:事物型临时表:在事务期间数据存在,事务结束后数据被自动删除。

2:会话型临时表:在会话期间数据存在,会话结束后数据被自动删除。

三、临时表的限制1:不能分区,不能是索引组织表或簇。

2:不能指定关于临时表的外键约束。

3:不支持并行DML或并行查询。

4:不支持分布式事务处理。

5:不能指定段存储语句、嵌套表存储语句或并行语句四、建立临时表的语法1:建立关系表2:建立对象表3:并行语句Oracle的分区表一、什么是分区表Oracle可以将大表或索引分成若干个更小更方便管理的部分,每一部分称为一个分区,这样的表称为分区表。

SQL语句使用分区表比全表或全表索引能提供更好的访问和处理数据。

下图是按周所建分区表示例。

二、使用分区表的限制1:不能分割是簇一部分的表。

2:不能分割含有LONG或LONG RAW列的表。

3:索引组织表IOT不能进行范围分区。

**采用基于规则的优化器时,有会从分区表中受益!三、分区方法1:范围分区(更适合历史数据库)—Oracle8从惟一可用的分区类型按照列的列表的范围分割表;如果是索引组织表,则列的列表就必须是索引组织表主键的子集。

分区关键列的限制:列列表中的列可以是任何一种内置的数据类型,ROWID、LONG、LOB或者TIMESTAMP WITH TIME ZONE除外。

关键字MAXVALUE比任何值都高(含NULL)。

2:散列分区--Oracle8i可用的分区类型指定这个表是按哈希算法分区的,分区的数目应为2的幂。

1)单独散列分区(individual_hash_partitions)及其限制使用子名按照名字指定单个分区,分区名可以匆略。

oracle建表、主键、分区

oracle建表、主键、分区

oracle建表、主键、分区1.创建表:create table student(s_name nvarchar2(20),s_sex nchar(2),s_age int);消除重复select distinct删除表drop table student;查看表select * from student;插⼊数据insert into student values('张三','男',12);或者student(字段名)查询插⼊多表插⼊查看表结构desc student;删除数据delete from student where s_name='张三';修改表名rename student to stt;删除字段alter table student drop column s_name;修改数据update student set name='李四' where name='张三'修改表中的字段名alter table student rename column s_name to s_name2;给表加备注comment on table student is '你是谁';查看表的备注信息select *from user_tab_comments where TABLE_NAME='STUDENT';添加字段alter table student add address nvachar2(10);修改字段alter table student modify address nvachar2(10);复制表create table stud3 as select * from student;2.列操作**给表salary_grades添加虚拟列,虚拟列ALTER TABLE salary_grades ADD (average_salary AS ((low_salary + high_salary)/2));修改列的⼤⼩ALTER TABLE order_status2 MODIFY status VARCHAR2(15);修改数字列精度ALTER TABLE order_status2 MODIFY id NUMBER(5);修改数据类型ALTER TABLE order_status2 MODIFY status CHAR(15);修改默认值ALTER TABLE order_status2 MODIFY last_modified DEFAULT SYSDATE - 1;3.主键和外键--为表添加主键create table student31(s_id int primary key, --字段类型后直接加上主键关键词即可s_name nvarchar2(20),s_age int);insert into student31 values(1,'zhang',18);insert into student31 values(2,'li',20);--表建⽴好后,如何添加主键--alter table student31 add constraint 主键约束名主键关键词(字段名);alter table student31 add constraint pk_s_id primary key(s_id);--举例:学⽣表和课程表建⽴外键create table stu1(s_id int,s_name nvarchar2(20),c_id int);create table course1(c_id int,c_name varchar2(20));--给course表添加主键alter table course1 add constraint pk_c_id1 primary key(c_id);--给student表添加主键alter table stu1 add constraint pk_s_id primary key(s_id);--在学⽣表中建⽴⼀个外键,通过去引⽤课程表中的主键alter table stu1 add constraint fk_c_id foreign key(c_id) references course1(c_id);``4.分区表4.1oracle创建⾮分区表:create table student31(s_id int primary key,s_name nvarchar2(20),s_age int);4.2oracle创建分区表:create table p_range_test(id number,name varchar2(100))partition by range(id)(partition t_p1 values less than (10),partition t_p2 values less than (20),partition t_p3 values less than (30));--查创建好分区表的信息:select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name='P_RANGE_TEST' order by partition_position; --添加⼀个分区alter table p_range_test add partition t_p4 values less than(40);--删除表drop table p_range_test purge;--创建带有maxvalue的分区表create table p_range_maxvalue_test (id number,name varchar2(100))partition by range(id)(partition t_p1 values less than (10),partition t_p2 values less than (20),partition t_p3 values less than (30),partition t_pmax values less than (maxvalue));--添加分区会报错alter table p_range_maxvalue_test add partition t_p4 values less than(40);--使⽤split完成上⾯没有完成的分区任务alter table p_range_maxvalue_test split partition t_pmax at (40) into (partition, partition t_pmax);。

Oracle学习笔记(十)分区索引失效的思考

Oracle学习笔记(十)分区索引失效的思考

Oracle学习笔记(⼗)分区索引失效的思考此处只说索引失效的场景(只会影响全局索引):结论:全局索引truncate 分区和交换分区都会导致索引失效果局部索引truncate分区不会导致索引失效。

drop table part_tab_trunc purge;create table part_tab_trunc (id int,col2 int,col3 int,contents varchar2(4000))partition by range (id)(partition p1 values less than (10000),partition p2 values less than (20000),partition p3 values less than (maxvalue));insert into part_tab_trunc select rownum ,rownum+1,rownum+2, rpad('*',400,'*') from dual connect by rownum <=50000;commit;create index idx_part_trunc_col2 on part_tab_trunc(col2) local;create index idx_part_trunc_col3 on part_tab_trunc(col3) ;---分区truncate前select index_name, partition_name, statusfrom user_ind_partitionswhere index_name = 'IDX_PART_TRUNC_COL2';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ --------IDX_PART_TRUNC_COL2 P1 USABLEIDX_PART_TRUNC_COL2 P2 USABLEIDX_PART_TRUNC_COL2 P3 USABLEselect index_name, statusfrom user_indexeswhere index_name = 'IDX_PART_TRUNC_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_TRUNC_COL3 VALIDalter table part_tab_trunc truncate partition p1 ;---分区truncate后select index_name, partition_name, statusfrom user_ind_partitionswhere index_name = 'IDX_PART_TRUNC_COL2';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ --------IDX_PART_TRUNC_COL2 P1 USABLEIDX_PART_TRUNC_COL2 P2 USABLEIDX_PART_TRUNC_COL2 P3 USABLEselect index_name, statusfrom user_indexeswhere index_name = 'IDX_PART_TRUNC_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_TRUNC_COL3 UNUSABLE此处只说索引失效的场景(也是只影响全局索引):--试验1(未加Update GLOBAL indexes关键字)drop table part_tab_drop purge;create table part_tab_drop (id int,col2 int ,col3 int,contents varchar2(4000))partition by range (id)(partition p1 values less than (10000),partition p2 values less than (20000),partition p3 values less than (maxvalue));insert into part_tab_drop select rownum ,rownum+1,rownum+2,rpad('*',400,'*') from dual connect by rownum <=50000;commit;create index idx_part_drop_col2 on part_tab_drop(col2) local;create index idx_part_drop_col3 on part_tab_drop(col3) ;--未drop分区之前select index_name,status from user_indexes where index_name='IDX_PART_DROP_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_DROP_COL3 VALIDalter table part_tab_drop drop partition p1 ;--已drop分区之后select index_name,status from user_indexes where index_name='IDX_PART_DROP_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_DROP_COL3 UNUSABLE--试验2(加Update GLOBAL indexes关键字)drop table part_tab_drop purge;create table part_tab_drop (id int,col2 int ,col3 int,contents varchar2(4000))partition by range (id)(partition p1 values less than (10000),partition p2 values less than (20000),partition p3 values less than (maxvalue));insert into part_tab_drop select rownum ,rownum+1,rownum+2,rpad('*',400,'*') from dual connect by rownum <=50000;commit;create index idx_part_drop_col2 on part_tab_drop(col2) local;create index idx_part_drop_col3 on part_tab_drop(col3) ;--未drop分区之前INDEX_NAME STATUS------------------------------ --------IDX_PART_DROP_COL3 VALIDalter table part_tab_drop drop partition p1 Update GLOBAL indexes;--已drop分区之后select index_name,status from user_indexes where index_name='IDX_PART_DROP_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_DROP_COL3 VALID--此处只说索引失效的场景:--分区表SPLIT的时候,如果MAX区中已经有记录了,这个时候SPLIT就会导致有记录的新增分区的局部索引失效! drop table part_tab_split purge;create table part_tab_split (id int,col2 int ,col3 int ,contents varchar2(4000))partition by range (id)(partition p1 values less than (10000),partition p2 values less than (20000),partition p_max values less than (maxvalue));insert into part_tab_split select rownum ,rownum+1,rownum+2,rpad('*',400,'*') from dual connect by rownum <=90000;commit;create index idx_part_split_col2 on part_tab_split (col2) local;create index idx_part_split_col3 on part_tab_split (col3) ;---分区split前select index_name, partition_name, statusfrom user_ind_partitionswhere index_name = 'IDX_PART_SPLIT_COL2';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ -------IDX_PART_SPLIT_COL2 P1 USABLEIDX_PART_SPLIT_COL2 P2 USABLEIDX_PART_SPLIT_COL2 P_MAX USABLEselect index_name, statusfrom user_indexeswhere index_name = 'IDX_PART_SPLIT_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_SPLIT_COL3 VALIDalter table part_tab_split SPLIT PARTITION P_MAX at (30000) into (PARTITION p3,PARTITION P_MAX);alter table part_tab_split SPLIT PARTITION P_MAX at (40000) into (PARTITION p4,PARTITION P_MAX);alter table part_tab_split SPLIT PARTITION P_MAX at (50000) into (PARTITION p5,PARTITION P_MAX);alter table part_tab_split SPLIT PARTITION P_MAX at (60000) into (PARTITION p6,PARTITION P_MAX);alter table part_tab_split SPLIT PARTITION P_MAX at (70000) into (PARTITION p7,PARTITION P_MAX);---分区split后select index_name, partition_name, statusfrom user_ind_partitionswhere index_name = 'IDX_PART_SPLIT_COL2';INDEX_NAME PARTITION_NAME STATUS------------------------------ ------------------------------ --------IDX_PART_SPLIT_COL2 P1 USABLEIDX_PART_SPLIT_COL2 P2 USABLEIDX_PART_SPLIT_COL2 P3 UNUSABLEIDX_PART_SPLIT_COL2 P4 UNUSABLEIDX_PART_SPLIT_COL2 P5 UNUSABLEIDX_PART_SPLIT_COL2 P6 UNUSABLEIDX_PART_SPLIT_COL2 P7 UNUSABLEIDX_PART_SPLIT_COL2 P_MAX UNUSABLEselect index_name, statusfrom user_indexeswhere index_name = 'IDX_PART_SPLIT_COL3';INDEX_NAME STATUS------------------------------ --------IDX_PART_SPLIT_COL3 UNUSABLE--结论是:split会导致全局索引失效,也会导致局部索引失效。

oracle大表分区方案

oracle大表分区方案

oracle大表分区方案
Oracle数据库是一款强大的关系型数据库管理系统,针对大规模数据的存储和查询需求,它提供了表分区的功能。

表分区可以将一个大表分割成多个小分区,以便于管理和查询。

在设计大表分区方案时,需要考虑以下几个方面:
1. 分区键的选择:分区键是用来划分分区的依据,选取合适的分区键可以提高查询效率。

常用的分区键有时间、地理位置和产品类型等。

需要注意的是,分区键必须是一个稳定的值,不会经常变动。

2. 分区类型的选择:Oracle提供了多种分区方式,包括范围分区、列表分区、哈希分区和复合分区等。

不同的分区方式适用于不同的场景,需要根据实际情况进行选择。

3. 分区维护的方法:分区表的维护需要考虑到数据的移动、备份和恢复等问题。

可以使用Oracle提供的分区维护工具或自定义的脚本来处理这些任务。

4. 分区索引的设计:分区表的索引也需要进行优化,可以使用局部索引或全局索引来提高查询效率。

5. 数据迁移的方案:当需要将一个大表分区时,需要考虑数据的迁移问题。

可以使用Oracle提供的数据迁移工具或自定义的脚本来完成这些任务。

综上所述,设计一个合理的大表分区方案需要考虑到多个方面,需要根据实际情况进行选择和优化。

在实际应用中,可以不断进行调整和改进,以满足不同的需求。

Oracle分区表 (Partition Table) 的创建及管理

Oracle分区表 (Partition Table) 的创建及管理

Oracle分区表 (Partition Table) 的创建及管理一、创建分区表分区表分为四类:1、范围分区表2、列表分区表3、哈希分区表4、组合分区表下面分别创建四类分区表。

1、范围分区表2、列表分区表3、哈希分区表4、组合分区表--注subpartitions 2 并不是指定subpartition的个数一定为2,实际上每个分区的子分区个数可以不同。

subpartitions 关键字的作用到底是什么?如果不指定subpartition的具体明细,则系统按照subpartitions 的值指定subpartition的个数生成子分区,名称由系统定义。

二、增加分区注:hash partitioned table 新增partition时,现有表的中所有data都有重新计算hash值,然后重新分配到分区中。

所以被重新分配的分区的indexes需要rebuild 。

三、删除分区You can drop partitions from range, list, or composite range-list partitioned tables.For hash-partitioned tables, or hash subpartitions of range-hash partitioned tables, you must perform. a coalesce operation instead.四、分区合并1. 合并父分区如果省略update indexes子句的话,必须重建受影响的分区的index 。

ALTER TABLErange_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES;2. 合并子分区五、分割分区hash partitions or subpartitions不能分割。

如果指定的分割分区包含任何的数据时,对应的indexes可以被标识为UNUSABLE 。

ORACLE分区表的概念及操作

ORACLE分区表的概念及操作

ORACLE分区表的概念及操作此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作. (1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作用3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作.(1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。

分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。

表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

( 2).表分区的具体作用Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。

通常,分区可以使某些查询以及维护操作的性能大大提高。

此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。

每个分区有自己的名称,还可以选择自己的存储特性。

从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。

但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。

什么时候使用分区表:1、表的大小超过2GB。

2、表中包含历史数据,新的数据被增加都新的分区中。

(3).表分区的优缺点表分区有以下优点:1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

Oracle分区表及分区索引-创建list分区

Oracle分区表及分区索引-创建list分区

Oracle分区表及分区索引-创建list分区创建list分区的语法如上,需要我们指定的:l column: 分区依赖列(注意:只能是一个);l partition:分区名称;l literal: 分区对应值(注意:每个分区可以对应多个值);l tablespace_clause: 分区的存储属性,例如所在表空间等属性(可为空),默认继承基表所在表空间的属性。

*************************************创建list分区表示例:JSSWEB> create table t_partition_list (id number,name varchar2(50))partition by list(id)(partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace tbspart01,partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace tbspart02,partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace tbspart03,partition t_list_pd values (default) tablespace tbspart04);表已创建。

上例能够实现与前面range分区示例相同的效果,当然针对本示例而言,list分区显然不好用啊~~~***********************************对于分区表的操作很多,其中某些操作仅针对某些分区有效,哪个操作适用于哪种分区格式具体可以先参考下面这个表格:-----------------------分区表Range List Hash Range-Hash Range-List是否带来IO操作增加分区(addpartition)支持支持支持支持支持除hash类型外,均不变带来大量IO收缩分区(coalescepartitions)//支持分区:/子分区:支持/是删除分区(droppartition)支持支持/分区:支持子分区:/支持无交换分区(exchangepartition)支持支持支持支持支持无合并分区(mergepartition)支持支持/分区:支持子分区:/支持是修改默认属性(modifydefaultattributes)支持支持支持支持支持无修改分区当前属性(modifypartition)支持支持支持支持支持无List分区增加值(modifypartitionaddvalues)/支持//分区:/子分区:支持无List分区删除值(modifypartitiondropvalues)/支持//分区:/子分区:支持单纯删除操作无,但可能为了实现成功删除,之前的准备操作会带来一定量的IO修改子分区模板(setsubpartitiontemplate)///支持支持无移动分区(movepartition)支持支持支持分区:支持子分区:/分区:支持子分区:/有重命名分区(renamepartition)支持支持支持支持支持无分隔分区(splitpartition)支持支持/分区:支持子分区:/支持有截断分区(truncatepartition)支持支持支持支持支持无 注:上述IO列的评估建立在假设分区中均存在一定量数据,并忽略修改数据字典可能触发的IO,忽略造成的索引的重编译带来的IO。

OraclePartition分区详细总结

OraclePartition分区详细总结

OraclePartition分区详细总结此⽂从以下⼏个⽅⾯来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作⽤3.表分区的优缺点4.表分区的⼏种类型及操作⽅法5.对表分区的维护性操作.(1.) 表空间及分区表的概念表空间: 是⼀个或多个数据⽂件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。

分区表:当表中的数据量不断增⼤,查询数据的速度就会变慢,应⽤程序的性能就会下降,这时就应该考虑对表进⾏分区。

表进⾏分区后,逻辑上表仍然是⼀张完整的表,只是将表中的数据在物理上存放到多个表空间(物理⽂件上),这样查询数据时,不⾄于每次都扫描整张表。

( 2).表分区的具体作⽤Oracle的表分区功能通过改善可管理性、性能和可⽤性,从⽽为各式应⽤程序带来了极⼤的好处。

通常,分区可以使某些查询以及维护操作的性能⼤⼤提⾼。

此外,分区还可以极⼤简化常见的管理任务,分区是构建千兆字节数据系统或超⾼可⽤性系统的关键⼯具。

分区功能能够将表、索引或索引组织表进⼀步细分为段,这些对象的段叫做分区。

每个分区有⾃⼰的名称,还可以选择⾃⼰的存储特性。

从数据库管理员的⾓度来看,⼀个分区后的对象具有多个段,这些段既可进⾏集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当⼤的灵活性。

但是,从应⽤程序的⾓度来看,分区后的表与⾮分区表完全相同,使⽤SQL DML 命令访问分区后的表时,⽆需任何修改。

什么时候使⽤分区表:1、表的⼤⼩超过2GB。

2、表中包含历史数据,新的数据被增加都新的分区中。

(3).表分区的优缺点表分区有以下优点:1、改善查询性能:对分区对象的查询可以仅搜索⾃⼰关⼼的分区,提⾼检索速度。

2、增强可⽤性:如果表的某个分区出现故障,表在其他分区的数据仍然可⽤;3、维护⽅便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

Oracle数据库学习笔记_常用分区partition操作语句

Oracle数据库学习笔记_常用分区partition操作语句
修改分区表的默认表空间:
alter table TB_TABLE modify default attributes tablespace TBS_TABLE_01;
修改该表上某个索引的默认表空间:
alter index ind_table modify default attributes tablespace tbs_table_01;
请求出错错误代码400请尝试刷新页面重试
Oracle数据库学习笔记 _常用分区 partition操作语句 Nhomakorabea添加分区
ALTER TABLE TB_table add PARTITION TB_table_201302 values 或split分区的时候,如果分区表或者分区索引的默认表空间不存在(即使新分区的表空间都指定了),会报错(该表空间不存在); ALTER TABLE TB_table SPLIT PARTITION TB_table_201302 at ('20130201') INTO (PARTITION TB_table_201301 tablespace TBS_table_201301_hist, PARTITION TB_table_201302);
查看该分区表的默认表空间:
select table_name,def_tablespace_name from dba_part_tables where table_name='TB_TABLE';
查看该表上的分区索引的默认表空间:
select index_name,def_tablespace_name from dba_part_indexes where table_name='TB_TABLE'; 或者直接查看该表的详细创建sql: select dbms_metadata.get_ddl('TABLE','TB_TABLE','TABLE_OWNER') from dual;

分区表、分区索引和全局索引部分总结

分区表、分区索引和全局索引部分总结

分区表、分区索引和全局索引部分总结分区表、分区索引和全局索引: 在⼀个表的数据超过过2000万条或占⽤2G空间时,建议建⽴分区表。

分区索引和全局索引: 分区索引就是在所有每个区上单独创建索引,它能⾃动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使⽤,也就是索引不会失效,维护起来⽐较⽅便,但是在查询性能稍微有点影响。

另外在create unique index idx_ta_c2 on ta(c2) local ;系统会报ORA-14039错误,这是因为ta表的分区列是c1,oracle不⽀持在分区表上创建PK主键时主键列不包含分区列,创建另外的约束 (unique)也不可以。

全局索引就是在全表上创建索引,它可以创建⾃⼰的分区,可以和分区表的分区不⼀样,也就是它是独⽴的索引。

在drop或truncate某个分区时需要创建索引alter index idx_xx rebuild,也可以alter table table_name drop partition partition_name update global indexes;实现,但是要花很长时间在重建索引上。

可以通过查询user_indexes、user_part_indexes和 user_ind_partitions视图来查看索引是否有效。

或者把全局索引分成多个区(注意和分区表的分区不⼀样): 注意索引上的引导列要和range后列⼀致,否则会有ORA-14038错误。

oracle会对主键⾃动创建全局索引 如果想在主键的列上创建分区索引,除⾮主键包括分区键,还有就是主键建在两个或以上列上。

在频繁删除表的分区且数据更新⽐较频繁时为了维护⽅便避免使⽤全局索引。

显⽰Oracle查看分区表信息显⽰数据库所有分区表的信息:DBA_PART_TABLES显⽰当前⽤户可访问的所有分区表信息:ALL_PART_TABLES显⽰当前⽤户所有分区表的信息:USER_PART_TABLES显⽰Oracle查看分区表信息显⽰数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS显⽰当前⽤户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS显⽰当前⽤户所有分区表的详细分区信息:USER_TAB_PARTITIONS显⽰⼦分区信息显⽰数据库所有组合分区表的⼦分区信息:DBA_TAB_SUBPARTITIONS显⽰当前⽤户可访问的所有组合分区表的⼦分区信息:ALL_TAB_SUBPARTITIONS显⽰当前⽤户所有组合分区表的⼦分区信息:USER_TAB_SUBPARTITIONS显⽰分区列显⽰数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS显⽰当前⽤户可访问的所有分区表的分区列信息:ALL_PART_KEY_COLUMNS显⽰当前⽤户所有分区表的分区列信息:USER_PART_KEY_COLUMNS显⽰⼦分区列显⽰数据库所有分区表的⼦分区列信息:DBA_SUBPART_KEY_COLUMNS显⽰当前⽤户可访问的所有分区表的⼦分区列信息:ALL_SUBPART_KEY_COLUMNS显⽰当前⽤户所有分区表的⼦分区列信息: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;如果我要将分区表中各个分区的数据都清空,可以⽤truncate table table_name;吗?还是必须从头执⾏1. alter table table_name truncate partition p1;2. alter table table_name truncate partition p2;3. alter table table_name truncate partition p3;4. alter table table_name truncate partition p4;5. alter table table_name truncate partition p5;6. alter table table_name truncate partition p6; 答:truncate table table_name。

OraclePartition详解优缺点

OraclePartition详解优缺点

Oracle表分区详解此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作用3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作.(1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。

分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。

表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

( 2).表分区的具体作用Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。

通常,分区可以使某些查询以及维护操作的性能大大提高。

此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。

每个分区有自己的名称,还可以选择自己的存储特性。

从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。

但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。

什么时候使用分区表:1、表的大小超过2GB。

2、表中包含历史数据,新的数据被增加都新的分区中。

(3).表分区的优缺点表分区有以下优点:1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

oracle重建分区索引语句

oracle重建分区索引语句

oracle重建分区索引语句摘要:1.简介2.Oracle数据库中的分区索引3.重建分区索引的必要性4.重建分区索引的语句5.总结正文:1.简介在Oracle数据库中,分区索引是一种提高查询性能的有效方法。

分区索引基于表中的一个或多个列,将数据划分为多个区,每个区包含相同类型的数据。

这使得查询只需要扫描相关的分区,而不是整个表,从而提高了查询速度。

然而,随着时间的推移,分区索引可能会变得碎片化,导致性能下降。

在这种情况下,重建分区索引是一个好的解决方案。

2.Oracle数据库中的分区索引在Oracle数据库中,分区索引是表空间中一个或多个表的索引。

分区索引基于一个或多个分区键(partition key)进行分区,分区键可以是单个列或多个列。

每个分区包含与分区键值相匹配的数据。

3.重建分区索引的必要性分区索引在提高查询性能方面具有很大优势,但随着时间的推移,分区索引可能会变得碎片化。

碎片化会导致查询性能下降,因为数据库需要更多的时间来查找和读取数据。

重建分区索引可以解决这一问题,将数据重新组织到更均匀的方式,从而提高查询性能。

4.重建分区索引的语句要重建分区索引,可以使用以下ALTER INDEX语句:```ALTER INDEX index_nameREBUILD PARTITION index_partitionPARTITION (partition_key)TABLESPACE (table_space_name);```其中,`index_name` 是索引的名称,`index_partition` 是需要重建的分区,`partition_key` 是分区键,`table_space_name` 是表空间名称。

例如,如果要重建名为`my_index`的分区索引,分区键为`date_column`,表空间为`my_tablespace`,可以使用以下语句:```ALTER INDEX my_indexREBUILD PARTITION my_index_partitionPARTITION (date_column)TABLESPACE my_tablespace;```5.总结在Oracle数据库中,分区索引是一种提高查询性能的有效方法。

数据管理与储存的合理分区与索引设计

数据管理与储存的合理分区与索引设计

数据管理与储存的合理分区与索引设计为了有效地管理和储存大量的数据,分区与索引设计是至关重要的。

合理的分区和索引方案可以提高数据的访问效率、减少储存空间的占用并优化数据库的性能。

本文将探讨数据管理与储存的合理分区与索引设计的相关内容。

一、分区设计分区是将一个大的数据集合划分为多个较小的子集,每个子集称为一个分区。

通过分区设计,我们可以将数据分散存储在不同的物理设备上,从而提高数据的容量和性能管理。

以下是一些常见的分区设计策略:1. 范围分区(Range Partitioning):根据某个列的范围值将数据划分到不同的分区中。

例如,一个订单表可以根据订单的创建时间来进行范围分区,每个分区存储一段时间内的订单数据。

2. 列分区(List Partitioning):根据某个列的具体值将数据划分到不同的分区中。

例如,一个产品库存表可以根据产品的类型(如电子产品、服装等)来进行列分区,每个分区存储指定类型的产品数据。

3. 哈希分区(Hash Partitioning):根据某个列的哈希值将数据均匀地分布到不同的分区中。

哈希分区可以保证数据在各个分区中分布均匀,避免热点数据导致的性能问题。

4. 联合分区(Composite Partitioning):将分区策略进行组合,同时使用多个分区键对数据进行划分。

例如,一个客户订单表可以使用范围分区和哈希分区相结合,先将数据根据地区进行范围分区,然后在每个分区内根据客户ID进行哈希分区。

通过合理的分区设计,可以实现数据的负载均衡、快速的数据访问以及高效的数据导入和删除操作。

二、索引设计索引是对数据库表中一个或多个列的值进行排序的数据结构,可以大大提高数据的查询效率。

在设计索引时,需要考虑以下几个方面:1. 列选择:选择适合建立索引的列,通常是那些经常被查询作为筛选条件的列。

例如,在一个客户表中,经常以客户姓名和客户ID作为查询条件,可以对这两列进行索引。

2. 唯一性:对于具有唯一性的列,如主键列或候选键列,应该建立唯一索引。

oracle重建分区索引语句

oracle重建分区索引语句

oracle重建分区索引语句
【原创实用版】
目录
1.Oracle 分区索引简介
2.重建分区索引的原因
3.重建分区索引的步骤
4.示例:使用 SQL 语句重建分区索引
正文
1.Oracle 分区索引简介
Oracle 分区索引是一种特殊类型的索引,它可以应用于分区表。


于分区表的数据量较大,使用分区索引可以提高查询效率,减少 I/O 操作。

在 Oracle 数据库中,当分区表的数据发生变化时,可能会导致分区索引变得无效或者过大,这时就需要对分区索引进行重建。

2.重建分区索引的原因
重建分区索引的主要原因有以下几点:
- 数据表分区后,数据分布不均,导致某些分区的数据量过大,从而使得分区索引失效。

- 随着业务的发展,数据表的数据量不断增加,导致分区索引过大,影响数据库性能。

- 数据表进行重新分区或者合并分区等操作,需要重新构建分区索引。

3.重建分区索引的步骤
重建分区索引的步骤如下:
- 首先,创建一个新的分区索引。

可以使用 CREATE INDEX 语句创建一个新的分区索引,新索引的分区与原索引保持一致。

- 然后,删除原有的分区索引。

使用 DROP INDEX 语句删除原有的分区索引。

- 最后,将新创建的分区索引与对应的表关联。

使用 ALTER TABLE 语句将新创建的分区索引与原表进行关联。

4.示例:使用 SQL 语句重建分区索引
假设有一个名为"test_table"的分区表,其分区键为"date",现在需要重建该表的分区索引。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

下载的,写的非常好,给大家分享下。

什么时候使用分区:1、大数据量的表,比如大于2GB。

一方面2GB文件对于32位os是一个上限,另外备份时间长。

2、包括历史数据的表,比如最新的数据放入到最新的分区中。

典型的例子:历史表,只有当前月份的数据可以被修改,而其他月份只能read-onlyORACLE只支持以下分区:tables, indexes on tables, materialized views, and indexes on materialized views分区对SQL和DML是透明的(应用程序不必知道已经作了分区),但是DDL可以对不同的分区进行管理。

不同的分区之间必须有相同的逻辑属性,比如共同的表名,列名,数据类型,约束;但是可以有不同的物理属性,比如pctfree, pctused, and tablespaces.分区独立性:即使某些分区不可用,其他分区仍然可用。

最多可以分成64000个分区,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。

可以不用to_date函数,比如:alter session set nls_date_format='mm/dd/yyyy';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('02/01/2000'),PARTITION sales_feb2000 VALUES LESS THAN('03/01/2000'), PARTITION sales_mar2000 VALUES LESS THAN('04/01/2000'), PARTITION sales_apr2000 VALUES LESS THAN('05/01/2000') );Partition Key:最多16个columns,可以是nullable的非分区的表可以有分区或者非分区的索引;分区表可以有分区或者非分区的索引;Partitioning 方法:Range PartitioningList PartitioningHash PartitioningComposite PartitioningComposite Partitioning:组合,以及 range-hash and range-list composite partitioningRange Partitioning:每个分区都有VALUES LESS THAN子句,表示这个分区小于(<)某个上限,而大于等于(>=)前一个分区的VALUES LESS THAN值。

MAXVALUE定义最高的分区,他表示一个虚拟的无限大的值。

这个分区包括null值。

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 LESSTHAN(TO_DATE('01/02/2000','DD/MM/YYYY')),PARTITION sales_feb2000 VALUES LESSTHAN(TO_DATE('01/03/2000','DD/MM/YYYY')),PARTITION sales_mar2000 VALUES LESSTHAN(TO_DATE('01/04/2000','DD/MM/YYYY')),PARTITION sales_apr2000 VALUES LESSTHAN(TO_DATE('01/05/2000','DD/MM/YYYY')),PARTITION sales_2000 VALUES LESS THAN(MAXVALUE));插入数据:Insert into sales_rangevalues(1,2,3,to_date('21-04-2000','DD-MM-YYYY'));Insert into sales_range values(1,2,3,sysdate);选择数据:select * from sales_range;select * from sales_range partition(sales_apr2000);select * from sales_range partition(sales_mar2000);select * from sales_range partition(sales_2000);按照多个列分区:CREATE TABLE sales_range1(salesman_id NUMBER(5),salesman_name VARCHAR2(30),sales_date DATE)PARTITION BY RANGE(sales_date, sales_amount)(PARTITION sales_jan2000 VALUES LESSTHAN(TO_DATE('01/02/2000','DD/MM/YYYY'),1000),PARTITION sales_feb2000 VALUES LESSTHAN(TO_DATE('01/03/2000','DD/MM/YYYY'),2000),PARTITION sales_mar2000 VALUES LESSTHAN(TO_DATE('01/04/2000','DD/MM/YYYY'),3000),PARTITION sales_apr2000 VALUES LESSTHAN(TO_DATE('01/05/2000','DD/MM/YYYY'),4000),PARTITION sales_2000 VALUES LESS THAN(MAXVALUE, MAXVALUE) );Insert into sales_range1 values(1,2,500,TO_DATE('21/01/2000','DD/MM/YYYY'));Insert into sales_range1 values(2,3,1500, sysdate);如果多个分区列的值冲突,则按照从左到右的优先级。

List Partitioning:可以组织无序的,或者没有关系的数据在相同的分区。

不支持多列的(multicolumn) partition keys,只能是一个列。

DEFAULT表示不满足条件的都放在这个分区。

CREATE TABLE sales_list(salesman_id NUMBER(5),salesman_name VARCHAR2(30),sales_state VARCHAR2(20),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));Hash Partitioning:不可以作splitting, dropping or merging操作。

但是可以added and coalesced.当我们无法判断有多少数据映射或者怎样映射到各个分区时,可以使用这种方法。

分区数据最好是2的幂,这样可以平均分配数据。

CREATE TABLE sales_hash1(salesman_id NUMBER(5),salesman_name VARCHAR2(30),sales_amount NUMBER(10),week_no NUMBER(2))PARTITION BY HASH(salesman_id)PARTITIONS 4STORE IN (users, TOOLS, TEST, TABLESPACE1); --表空间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)(PARTITION p1 tablespace users,PARTITION p2 tablespace system);Composite Partitioning:先按照range分区,每个子分区又按照list or hash分区。

CREATE TABLE sales_composite(salesman_id NUMBER(5),salesman_name VARCHAR2(30),sales_amount NUMBER(10),sales_date DATE)PARTITION BY RANGE(sales_date)SUBPARTITION BY HASH(salesman_id) --子分区SUBPARTITION TEMPLATE(SUBPARTITION sp1 TABLESPACE data1,SUBPARTITION sp2 TABLESPACE data2,SUBPARTITION sp3 TABLESPACE data3,SUBPARTITION sp4 TABLESPACE data4)(PARTITION sales_jan2000 VALUES LESSTHAN(TO_DATE('02/01/2000','DD/MM/YYYY'))PARTITION sales_feb2000 VALUES LESSTHAN(TO_DATE('03/01/2000','DD/MM/YYYY'))PARTITION sales_mar2000 VALUES LESSTHAN(TO_DATE('04/01/2000','DD/MM/YYYY'))PARTITION sales_apr2000 VALUES LESSTHAN(TO_DATE('05/01/2000','DD/MM/YYYY'))PARTITION sales_may2000 VALUES LESSTHAN(TO_DATE('06/01/2000','DD/MM/YYYY')));使用TEMPLATE,oracle会这样命名子分区:分区_子分区,比如sales_jan2000_sp1表示将数据放在data1表空间Range-list:CREATE TABLE bimonthly_regional_sales(deptno NUMBER,item_no VARCHAR2(20),txn_date DATE,txn_amount NUMBER,state VARCHAR2(2))PARTITION BY RANGE (txn_date)SUBPARTITION BY LIST (state)SUBPARTITION TEMPLATE(SUBPARTITION east VALUES('NY', 'VA', 'FL') TABLESPACE system,SUBPARTITION west VALUES('CA', 'OR', 'HI') TABLESPACE users,SUBPARTITION central VALUES('IL', 'TX', 'MO') TABLESPACE tools)( PARTITION janfeb_2000 VALUES LESS THAN(TO_DATE('1-03-2000','DD-Mm-YYYY')), PARTITION marapr_2000 VALUES LESS THAN (TO_DATE('1-05-2000','DD-Mm-YYYY')), PARTITION mayjun_2000 VALUES LESS THAN (TO_DATE('1-07-2000','DD-Mm-YYYY')) );分区维护操作:移动分区:通常是移动到不同的表空间。

相关文档
最新文档