深入学习分区表及分区索引(详解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中,一共可以为分区表建立三种类型的索引,下面分别介绍它们的特点和适用情况。
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数据库中的一项功能,允许将表或索引分割成多个逻辑分区,这样可以更好地管理和维护大型数据集。
使用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数据库中的一个对象,它可以帮助数据库系统更快地检索数据。
索引类似于书籍的目录,可以快速定位到所需的数据。
二、索引的分类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索引详解

一.索引介绍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对于分区表⽅式其实就是将表分段存储,⼀般普通表格是⼀个段存储,⽽分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在那个分区或那⼏个内部,然后在分区内部去查找数据,⼀个分区⼀般保证四⼗多万条数据就⽐较正常了,但是分区表并⾮乱建⽴,⽽其维护性也相对较为复杂⼀点,⽽索引的创建也是有点讲究的,这些以下尽量阐述详细即可。
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的临时表一、表的种类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建表、主键、分区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学习笔记(⼗)分区索引失效的思考此处只说索引失效的场景(只会影响全局索引):结论:全局索引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数据库是一款强大的关系型数据库管理系统,针对大规模数据的存储和查询需求,它提供了表分区的功能。
表分区可以将一个大表分割成多个小分区,以便于管理和查询。
在设计大表分区方案时,需要考虑以下几个方面:
1. 分区键的选择:分区键是用来划分分区的依据,选取合适的分区键可以提高查询效率。
常用的分区键有时间、地理位置和产品类型等。
需要注意的是,分区键必须是一个稳定的值,不会经常变动。
2. 分区类型的选择:Oracle提供了多种分区方式,包括范围分区、列表分区、哈希分区和复合分区等。
不同的分区方式适用于不同的场景,需要根据实际情况进行选择。
3. 分区维护的方法:分区表的维护需要考虑到数据的移动、备份和恢复等问题。
可以使用Oracle提供的分区维护工具或自定义的脚本来处理这些任务。
4. 分区索引的设计:分区表的索引也需要进行优化,可以使用局部索引或全局索引来提高查询效率。
5. 数据迁移的方案:当需要将一个大表分区时,需要考虑数据的迁移问题。
可以使用Oracle提供的数据迁移工具或自定义的脚本来完成这些任务。
综上所述,设计一个合理的大表分区方案需要考虑到多个方面,需要根据实际情况进行选择和优化。
在实际应用中,可以不断进行调整和改进,以满足不同的需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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')) );分区维护操作:移动分区:通常是移动到不同的表空间。