oracle 表分区 partition技术
oracle表分区的,分区操作,分区查询,子分区查询
oracle表分区的,分区操作,分区查询,⼦分区查询⼀、摘要有关表分区的⼀些维护性操作:注:分区根据具体情况选择。
表分区有以下优点:1、数据查询:数据被存储到多个⽂件上,减少了I/O负载,查询速度提⾼。
2、数据修剪:保存历史数据⾮常的理想。
3、备份:将⼤表的数据分成多个⽂件,⽅便备份和恢复。
4、并⾏性:可以同时向表中进⾏DML操作,并⾏性性能提⾼。
⼆、分区操作1. 添加分区以下代码给SALES表添加了⼀个P3分区ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));注意:以上添加的分区界限应该⾼于最后⼀个分区界限。
以下代码给SALES表的P3分区添加了⼀个P3SUB1⼦分区ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');2. 删除分区以下代码删除了P3表分区:ALTER TABLE SALES DROP PARTITION P3;在以下代码删除了P4SUB1⼦分区:ALTER TABLE SALES DROP SUBPARTITION P4SUB1;注意:如果删除的分区是表中唯⼀的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。
3. 截断分区截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。
当表中即使只有⼀个分区时,也可以截断该分区。
通过以下代码截断分区:ALTER TABLE SALES TRUNCATE PARTITION P2;通过以下代码截断⼦分区:ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;4. 合并分区合并分区是将相邻的分区合并成⼀个分区,结果分区将采⽤较⾼分区的界限,值得注意的是,不能将分区合并到界限较低的分区。
Oracle表分区
1.表分区的概念表分区允许用户把一个表中的所有行在物理上分为几个部分,但逻辑上这些所有的行都还在同一张表中,并将这些部分存储在不同的位置,被分区的表称为分区表,分成的每一个部分称为一个分区.2.表分区的优点允许用户将一个表分成多个分区用户可以执行查询,只访问表中的特定分区将不同的分区存储在不同的磁盘,提高访问性能和安全性可以独立地备份和恢复每个分区3.表分区的方法a)范围分区根据表的某一列或一组列的值范围,决定将该数据存储在哪个分区上.如可以根据序号分区,根据业务数据的生产日期分区等.语法:PARTITION BY RANGE (column_name)(PARTITION part1 V ALUE LESS THAN (range1) [TABLESPACE tbs1],PARTITION part2 V ALUE LESS THAN (range2) [TABLESPACE tbs2],……PARTITION partN V ALUE LESS THAN (MAXV ALUE) [TABLESPACE tbsN] )Column_name 是以此列名为基础创建范围分区,特定行的该列值称为分区健Part….partN 是分区的名称Range1….MAXV ALUE 是分区的边界值,range1只表示小于range1之内,不包括range1Tbs1….tbsN 是分区所在的表空间b)散列分区通过在分区键值上执行一个散列函数来决定数据的物理位置,和范围分区不同的是范围分区的连续值通常存储在相同的分区中,而散列分区中,连续的分区键不必存储在相同的分区中.它是将记录平均分布到不同的分区.语法:PARTITION BY HASH (column_name)(PARTITION part1 [TABLESPACE tbs1],PARTITION part2 [TABLESPACE tbs2],……PARTITION partN [TABLESPACE tbsN])或PARTITION BY HASH (column_name)PARTITIONS number_of_partitions [STORE IN (tablespace_list)]Column_name 是以此列名为基础创建散列分区number_of_partitions 是散列分区的数目tablespace_list 是指定分区的表空间Tbs1….tbsN 是分区所在的表空间c)复合分区复合分区是范围分区和散列分区的结合.在创建复合分区时,先根据范围对数据进行分区,然后再在这些分区内创建散列子分区,它便于管理.语法:PARTITION BY RANGE (column_name1)SUBPARTITION BY HASH (column_name2)SUBPARTITIONS number_of_partitions [STORE IN (tablespace_list)](PARTITION part1 V ALUE LESS THAN (range1),PARTITION part2 V ALUE LESS THAN (range2),……PARTITION partN V ALUE LESS THAN (MAXV ALUE))column_name1 是以此列为基础创建范围分区column_name2 是以此列为基础创建散列分区number_of_partitions 是散列分区的数目Part….partN 是分区的名称Range1….MAXV ALUE 是分区的边界值,range1只表示小于range1之内,不包括range1d)列表分区允许用户明确地控制行到分区的映射,允许按自然方式对无序和不相关的数据集进行分组和组织.语法:PARTITION BY LIST (column_name)(PARTITION part1 V ALUE (values_list1),PARTITION part2 V ALUE (values_list2),……PARTITION partN V ALUE (DEFAULT))column_name 是以此列为基础创建列表分区Part….partN 是分区的名称V alues_list 是对应分区的分区键值的列表DEFAULT 关键字允许存储前面的分区不能存储的记录.4.表分区的操作a)添加分区: 在最后一个分区后添加新的分区语法:ALTER TABLE 表名ADD PARTITION 新分区名V ALUES LESS THAN (分区范围);b)删除分区: 删除一个指定的分区,分区里的数据也随之删除语法:ALTER TABLE 分区所在的表名DROP PARTITION 被删除的分区名;c)截断分区: 删除指定分区里的所有记录语法:ALTER TABLE分区所在的表名TRUNCA TE PARTITION 被截断的分区名;d)合并分区: 将范围分区和复合分区的两个相邻的分区连接起来语法:ALTER TABLE 表名MERGE PARTITIONS 被合并的分区1, 被合并的分区2 …INTO PARTITION 合并后的分区名;e)拆分分区: 将一个大的分区中的记录分到两个分区中语法:ALTER TABLE 表名SPLIT PARTITION 被拆分的分区名A T (拆分后分区范围) INTO (拆分后的分区1(存放原来分区范围内记录), 拆分后的分区2(存入指定范围的记录));5.在分区表中查看记录语法:Select * from 表名partition 分区名。
Oracle 分区表的优点
ORACLE 表分区表分区的好处和事处理表分区描述表分区(partition):表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。
而这种分区对于应用来说是透明的。
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。
通常,分区可以使某些查询以及维护操作的性能大大提高。
此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
每个分区有自己的名称,还可以选择自己的存储特性。
每个分区都是一个独立的段(SEGMENT),可以存放到相同(不同)的表空间中。
从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。
(对于高效率查询是有影响,主要差别是对某一分区数据时行查询时和对整体数据进行查询)表分区的好处通过对表进行分区,可以获得以下的好处:1)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;2)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;3)均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;4)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
分区表事务操作的时候,指定了分区,系统在执行的时候则只操作该分区的记录,提高了数据处理的速度。
不要指定分区直接操作数据也是可以的。
在分区表上建索引及多索引的使用和非分区表一样。
此外,因为在维护分区的时候可能对分区的索引会产生一定的影响,可能需要在维护之后重建索引,相关内容请参考分区表索引部分的文档缺点分区表相关:已经存在的表没有方法可以直接转化为分区表。
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中的表进行分区电脑资料表空间是指磁盘上的一块存储区域,用来存放表,使用范围分区法对数据量大的表进行分区,分区存放到不同的表空间。
范围分区就是用表中的某个字段值的范围进行分区。
比如:1)用数值型的id字段,id<100000的在第1个分区,100000<=id<200000的在第二个分区。
2)用日期类型的字段,xx年的数据在一个分区,xx年的数据在另一个分区,或者也可以按月份进行划分。
范围分区语法:1)partition by range(field) field 就是表中要划分范围的那个字段。
2)VALUES LESS THAN(value) value 就是field的值,表示小于这个值的。
如VALUES LESS THAN(1000) 就表示属性值小于1000,不包括1000如VALUES LESS THAN (TO_DATE('xx/2/1','yyyy/MM/dd')) 就表示属性值小于xx年2月1日的,不包括xx年2月1日3)在最高的分区中,VALUES LESS THAN(maxValue)定义的是一个最大的值范围分区步骤:1)建立表空间建立三个表空间测试用CREATE TABLESPACE APP_TS_01 --建立第一个表空间 APP_TS_01NOLOGGING --不生成日志DATAFILE '/home/oracle/oradata/appdata/app_data_01.def' --指定表空间在磁盘上的位置SIZE 1024M --指定表空间大小CREATE TABLESPACE APP_TS_02 --建立第二个表空间 APP_TS_02NOLOGGING --不生成日志DATAFILE '/home/oracle/oradata/appdata/app_data_02.def' --指定表空间在磁盘上的位置SIZE 1024M --指定表空间大小CREATE TABLESPACE APP_TS_03 --建立第三个表空间 APP_TS_03NOLOGGING --不生成日志DATAFILE '/home/oracle/oradata/appdata/app_data_03.def' --指定表空间在磁盘上的位置SIZE 1024M --指定表空间大小2)建立表和对表进行分区--创建订单表create table t_order(id NUMBER primary key not null , --主键order_no VARCHAR2(30) not null, --订单号order_time DATE not null --订单时间)--对订单表进行分区partition by range (order_time)--根据订单时间范围进行划分 (--小于xx年1月份的数据存放到分区t_order_01,存在表空间APP_TS_01PARTITION t_order_01 VALUES LESS THAN(TO_DATE('xx/2/1','yyyy/MM/dd')) TABLESPACE APP_TS_01,--xx年2月份的数据存放到分区t_order_01,存在表空间APP_TS_01PARTITION t_order_02 VALUES LESS THAN(TO_DATE('xx/3/1','yyyy/MM/dd')) TABLESPACE APP_TS_02,--xx年3月份的数据存放到分区t_order_01,存在表空间APP_TS_01PARTITION t_order_02 VALUES LESS THAN(TO_DATE('xx/4/1','yyyy/MM/dd')) TABLESPACE APP_TS_03)4)查询分区数据--查询所有分区数据select * from t_order--只查t_order_01分区的订单数据select * from t_order PARTITION(t_order_01)--联合查询t_order_01分区和t_order_02分区的数据 select * from t_order PARTITION(t_order_01)UNION ALLselect * from t_order PARTITION(t_order_02) 内容仅供参考。
Oracle分区表(partitioned table)
Oracle分区表(partitioned table)管理分区表和索引一、什么是分区表现在的数据库,单个表的数据量可能很大,达到几百个G和几T的程度,这时侯,你需要使用分区表和分区索引来管理数据,它将一个大的多分为块,称为分区(patitions),甚至子分区(subpartition)。
每一个分区都保存在自已的段中,可以单独的管理。
分区可以结合并行执行和合理的数据分布来提高系统的可用性和性能。
●减少数据中断的可能性●可以单独备份或恢复每一个分区●控制分区的分布(平衡I/O负荷)●提高可管理性,可用性和性能二、表分区的方法1. range 使用表的字段的值的范围来进行分区,它特别适用于数据有逻辑范围的表。
如一年中的月。
当数据在范围内均匀分布时性能最好。
create table salse ( invoice_no number, sale year int not null, sale month int not null, sale_day int not null) partion by range(sale yea,sale_month,sale_day) (partition sale_q1 value less than (1999,04,01) tablespace tsa partition sale_q2 value less than (2000,04,01) tablespace tsb partition sale_q2 value less than (maxvalue) tablespace tsc);--最大值maxvalue 可以指定 enable row movement来设置当分区列的值被修改时,将行移动到不同的分区。
2. hash 当数据不容易使用range分区,但你又需要使用分区来提高性能和可管理性,hash分区方法,根据分区值(partitioning key)的hash值来确定分区。
oracle创建分区表语法
oracle创建分区表语法在Oracle中,分区表是一个物理数据库对象,它允许您将一个大表的数据分割成较小的、更易于管理的片段,称为分区。
每个分区可以在不同的表空间中存储,并且可以独立地备份和恢复。
这可以提高查询性能,备份和恢复的效率,以及管理大量数据的便利性。
创建分区表的语法如下:```sqlCREATE TABLE table_name (column1 datatype1,column2 datatype2,...)PARTITION BY partition_method (partition_name1 value_column1 value_range,partition_name2 value_column2 value_range,...);```这里是一些常见的分区方法:RANGE Partitioning:根据列的值范围对数据进行分区。
LIST Partitioning:根据列的离散值对数据进行分区。
HASH Partitioning:根据计算列的哈希值对数据进行分区。
KEY Partitioning:类似于 RANGE Partitioning,但使用索引的键值进行分区。
以下是一个创建RANGE分区表的例子:```sqlCREATE TABLE sales (order_id NUMBER,sale_date DATE,amount NUMBER)PARTITION BY RANGE (sale_date) (PARTITION p0 VALUES LESS THAN (TO_DATE('', 'YYYY-MM-DD')), PARTITION p1 VALUES LESS THAN (TO_DATE('', 'YYYY-MM-DD')),PARTITION p2 VALUES LESS THAN (MAXVALUE));```在这个例子中,`sales` 表根据 `sale_date` 列的值被分成了三个分区:p0、p1 和 p2。
oracle数据库表分区方法
oracle数据库表分区方法【原创实用版4篇】篇1 目录1.Oracle 数据库表分区的概念和理解2.Oracle 数据库表分区的操作方法3.Oracle 数据库表分区的优势和应用场景4.总结篇1正文一、Oracle 数据库表分区的概念和理解Oracle 数据库表分区是一种将大表按照一定规则划分为多个小表的方法,这样可以提高查询效率和数据管理方便性。
在 Oracle 数据库中,表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中。
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。
二、Oracle 数据库表分区的操作方法1.范围分区:根据数据范围进行分区,例如按照年份、季度等时间属性进行分区。
2.列表分区:根据数据中的某一列的值进行分区,例如按照地区、产品类型等进行分区。
3.复合分区:结合范围分区和列表分区,根据多个属性进行分区。
具体的分区操作方法如下:1.创建分区表:使用 CREATE TABLE 语句创建一个分区表,例如:```CREATE TABLE sales (invoiceno NUMBER,number NUMBER,saledate DATE,not NULL)PARTITION BY RANGE (saledate);```2.添加分区:如果需要对已有的分区表添加新的分区,可以使用ALTER TABLE 语句,例如:```ALTER TABLE salesADD PARTITION (PARTITION sales_p2 VALUES LESS THAN(TO_DATE("2000-01-01", "YYYY-MM-DD")));```3.删除分区:如果需要删除分区表中的某个分区,可以使用 ALTER TABLE 语句,例如:```ALTER TABLE salesDROP PARTITION sales_p1;```三、Oracle 数据库表分区的优势和应用场景1.提高查询效率:分区表可以将大表划分为多个小表,这样可以减少查询时的 I/O 操作,提高查询效率。
oracle分区技术总结
oracle分区技术总结Oracle分区技术总结电信事业部张雷⼀.分区概述:为了简化数据库⼤数据量的管理,ORACLE推出了分区选项。
分区将表或索引分离在若⼲不同的表空间上,⽤分⽽治之的⽅法来⽀撑⽆限膨胀的⼤表和索引,从⽽提⾼⼤表和索引在物理⼀级的可管理性。
将它们分割成较⼩的分区可以改善表和分区的维护、备份、恢复、事务及查询性能。
⼆.分区的特点:◆所有的分区的逻辑属性是相同的,但他们的物理属性可以不同。
◆分区的剪枝(Partition Pruning)Oracle server 可以⾃动识别分区,根据select 语句所指定的选择条件,只查询有⽤的分区。
如果语句的条件中对分区字段使⽤了函数,优化器则不能进⾏分区剪枝,但to_date函数除外。
◆分区的优点(1) ⾼可⽤性:如果表的⼀个分区由于系统故障⽽不能使⽤,表的其余好的分区仍然可以使⽤;(2) 减少关闭时间:如果系统故障只影响表的⼀部分分区,那么只有这部分分区需要修复,故能⽐整个⼤表修复花的时间更少;(3) 维护轻松:对于⼤型的历史数据表,将其分区,分别管理和⽅便地添加和删除。
;(4) 均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;(5) 改善性能:对⼤表的查询、增加、修改等操作可以分解到表的不同分区来并⾏执⾏,可使运⾏速度更快;(6) 基于分区的 join 操作,会提⾼查询性能(7) 分区对⽤户透明,最终⽤户感觉不到分区的存在。
三.分区的⽅法:◆Range Partitioning (范围分区)范围分区就是对数据表中的某个值的范围进⾏分区,根据某个值的范围,决定将该数据存储在哪个分区上。
如根据城市分区,根据时间进⾏分区等。
实现⽅法就是在CREATE TABLE命令中增加PARTITION BY RANGE⼦句。
例如:CREATE TABLE UNITELE.BB_ACCOUNT_INFO_T(ACCOUNT_ID NUMBER(10),CITY_CODE V ARCHAR2(8 BYTE) NOT NULL,CUSTOMER_ID NUMBER(10) NOT NULL,MAIL_SERVICE NUMBER(4),REMARK V ARCHAR2(256 BYTE),IF_VALID NUMBER(2) DEFAULT 1,ACCOUNT_FA VOUR_ID NUMBER(8) DEFAULT 0 NOT NULL )TABLESPACE TS_TAB_BASEPARTITION BY RANGE (CITY_CODE)(PARTITION PART840 V ALUES LESS THAN ('841'),PARTITION PART_OTHER V ALUES LESS THAN (MAXV ALUE));分区的字段可以是⼀个列,也可以是多个列。
oracle数据库优化——表分区技术
oracle的分区合并、拆分、交换、截断原理
oracle的分区合并、拆分、交换、截断原理Oracle数据库中的分区是将大型数据库表分割成更小、更可管理的部分的一种方法。
通过将表数据分成不同的分区并将其存储在不同的表空间中,可以提高查询和维护的效率。
Oracle提供了多种分区管理操作,包括分区合并、拆分、交换和截断。
以下是对这些操作的详细解释。
1.分区合并(Partition Merge):分区合并是将多个连续分区合并成一个更大的分区的过程。
这种操作通常适用于当分区中的数据量减少,或者当需要合并多个分区以释放空间或重新组织数据时。
分区合并的过程中,Oracle将分区之间的数据重新分配到合并后的分区中,同时更新相关的索引和数据字典信息。
分区合并的步骤如下:1)确定要合并的分区范围以及目标分区。
2)备份需要合并的分区数据和索引。
3)执行ALTER TABLE语句来合并分区。
4)重新创建索引和相关的约束。
2.分区拆分(Partition Split):分区拆分是将一个分区分割成两个或多个更小的分区的过程。
这种操作通常在需要将数据重新组织或者调整分区结构时使用。
分区拆分的过程中,Oracle会将拆分的分区中的数据和索引重新分配到新的分区中,并同时更新相关的索引和数据字典信息。
分区拆分的步骤如下:1)确定要拆分的分区范围。
2)备份需要拆分的分区数据和索引。
3)执行ALTER TABLE语句来拆分分区。
4)重新创建索引和相关的约束。
3.分区交换(Partition Exchange):分区交换是将一个已经存在的非分区表与一个分区表进行交换的过程。
这种操作通常用于将历史数据移动到归档表中,或者将新数据从归档表中移回到主分区表中。
分区交换的过程中,Oracle会交换表和分区之间的数据和索引,并同时更新相关的索引和数据字典信息。
分区交换的步骤如下:1)确定要交换的表和分区的范围。
2)备份需要交换的表和分区数据和索引。
3)执行ALTER TABLE EXCHANGE PARTITION语句来进行分区交换。
oracle表分区管理partition
oracle表分区管理partition环境:oracle12c1、表分区⼤的种类表的分区:具有相同的逻辑属性,每个分区可以具有独⽴的物理属性分区键 partition key分区表中的每⼀⾏都需要明确分配给某个分区(通过分区键)分区表 partition table表中具有long和long raw数据类型的表不允许做分区表1)Range #通过值的范围⽅式建分区2)Hash #通过hash值⽅式建分区3)List #通过列举值的⽅式建分区分区字典表SELECT * FROM dba_part_tables #查看数据库存在分的分区表SELECT * FROM dba_tab_partitions #查看表的分区信息SELECT * FROM dba_part_key_columns #查看表分区的字段(分区键)SELECT * FROM dba_part_indexes #查看表分区的索引2、range分区a、创建range分区CREATE TABLE hr.orders(orders_id number,orders_date date,orders_comment VARCHAR2(200))PARTITION BY RANGE(orders_date)(PARTITION orders_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs03,PARTITION orders_2020_q2 VALUES LESS THAN(to_date('2020-07-01','yyyy-mm-dd')) TABLESPACE test01,PARTITION orders_2020_q3 VALUES LESS THAN(to_date('2020-10-01','yyyy-mm-dd')) ,PARTITION orders_2020_q4 VALUES LESS THAN(to_date('2021-01-01','yyyy-mm-dd')));ALTER TABLE hr.orders TRUNCATE PARTITION orders_2020_q1; #清空分区表数据ALTER TABLE hr.orders DROP PARTITION orders_2020_q1; #删除某个分区ALTER TABLE hr.orders #添加分区ADD PARTITION orders_2021_q1 VALUES LESS THAN(to_date('2021-04-01','yyyy-mm-dd')) TABLESPACE tbs03;ALTER TABLE hr.orders #合并两个分区为⼀个分区MERGE PARTITIONS orders_2020_q2,orders_2020_q3 INTO PARTITION orders_2020_Q2_Q3;ALTER TABLE hr.orders #拆分⼀个分区为两个分区SPLIT PARTITION orders_2020_q2_q3 AT(to_date('2020-07-01','yyyy-mm-dd')) INTO (PARTITION orders_2020_q2 TABLESPACE test01,PARTITION orders_2020_q3 TABLESPACE tbs02);3、Hash分区a、创建hash分区(4个分区分别存储在不同表空间,⾃动⽣成分区名称)CREATE TABLE hr.test_hash01(id number,name varchar2(20))PARTITION BY HASH(id)PARTITIONS 4 STORE IN(users,test01,tbs02,tbs03);--实验插⼊hash表数据beginfor i in1..1000 loopINSERT INTO hr.test_hash01 VALUES(i,i||'a');end loop;COMMIT;end;b、创建hash分区⼿动指定分区名称CREATE TABLE hr.test_hash02(id number,name varchar2(20))PARTITION BY HASH(id)(PARTITION thash02_p1 TABLESPACE tbs02,PARTITION thash02_p2 TABLESPACE users,PARTITION thash02_p3 TABLESPACE tbs03,PARTITION thash02_p4 TABLESPACE test01);4、list分区a、创建list分区,根据不同地点来分区CREATE TABLE hr.test_list01(orders_id NUMBER,orders_city VARCHAR2(20))PARTITION BY LIST(orders_city)(PARTITION tl_east VALUES('Shanghai','Jiangsu') TABLESPACE test01,PARTITION tl_south VALUES('Guangzhou','Guangxi') TABLESPACE tbs02,PARTITION tl_west VALUES('Sichuang','Guizhou') TABLESPACE users,PARTITION tl_north VALUES('Beijing','Henan') TABLESPACE tbs03);b、需要添加tl_west分区的list值(⽐较⿇烦分三步:先添加⼀个分区、合并分区、改名)ALTER TABLE hr.test_list01 #添加分区ADD PARTITION tl_yunan VALUES('Yunan');ALTER TABLE hr.test_list01 #合并分区MERGE PARTITIONS tl_yunan,tl_west INTO PARTITION tl_others TABLESPACE test01;ALTER TABLE hr.test_list01 #改成以前的名称RENAME PARTITION tl_others TO tl_west;c、拆分list分区(将tl_west拆分成三个独⽴分区)ALTER TABLE hr.test_list01SPLIT PARTITION TL_WEST INTO(PARTITION tl_west_01 VALUES('Yunan') TABLESPACE tbs02,PARTITION tl_west_02 VALUES('Sichuang') TABLESPACE tbs03,PARTITION tl_west_03 TABLESPACE test01);5、INTERVAL Partition 间隔分区(属于range分区的⼀种)(该种分区表可以根据插⼊的数据⾃⼰建分区)该分区键只能是当个列数据类型number或者date类型numtoymintervalnumtodsintervala、创建分区(创建⼀个分区表,以三个⽉⼀个分区,插⼊的值⼤于分区规定会按照要求⾃动新建分区)CREATE TABLE hr.test_interval01(orders_id number,orders_date date)PARTITION BY RANGE(orders_date)INTERVAL(numtoyminterval(3,'MONTH'))(PARTITION ti01_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs02);INSERT INTO hr.test_interval01 VALUES(2,sysdate+300); #插⼊⼀个值,分区表⾃动再建⼀个分区COMMIT;6、reference partition 引⽤分区,⼦表的分区对应主表的分区(引⽤⽗表的分区信息)a、创建主表分区CREATE TABLE hr.test_orders(order_id number primary key,order_date date)PARTITION BY RANGE(order_date)(PARTITION torders_2020_q1 VALUES LESS THAN(to_date('2020-04-01','yyyy-mm-dd')) TABLESPACE tbs03,PARTITION torders_2020_q2 VALUES LESS THAN(to_date('2020-07-01','yyyy-mm-dd')) TABLESPACE test01,PARTITION torders_2020_q3 VALUES LESS THAN(to_date('2020-10-01','yyyy-mm-dd')),PARTITION torders_2020_q4 VALUES LESS THAN(to_date('2021-01-01','yyyy-mm-dd')));b、创建⼦表分区CREATE TABLE hr.test_order_item(id NUMBER PRIMARY KEY,order_id NUMBER NOT NULL,data VARCHAR2(200),CONSTRAINT testoi_fk_orderid FOREIGN KEY(order_id) REFERENCES hr.test_orders(order_id) --该约束为主表的外键)PARTITION BY REFERENCE(testoi_fk_orderid); --通过外键建⽴链接7、Virtual Column-Based Partitioning 虚拟列分区(通过虚拟的键创建分区)a、创建分区CREATE TABLE hr.test_vbp01(id number PRIMARY KEY,name varchar2(20),phone CHAR(11) NOT NULL,phone_prefix AS (substr(phone,1,3)) --该键为电话号码前三位)PARTITION BY LIST(phone_prefix)(PARTITION tvbp_p01 VALUES ('130','131','132'),PARTITION tvbp_p02 VALUES ('133','134','135'),PARTITION tvbp_p03 VALUES ('136','137','138'),PARTITION tvbp_p04 VALUES ('139','189','188'),PARTITION tvbp_other VALUES (default));8、SYSTEM PARTITION 系统分区(该分区只指定分区名称,不指定键,⽤户插⼊表的时候需要指定对应分区插⼊)a、创建系统分区CREATE TABLE hr.system_partition01(id number PRIMARY KEY,name varchar2(20) NOT NULL)PARTITION BY SYSTEM(PARTITION tsp_01 TABLESPACE tbs02,PARTITION tsp_02 TABLESPACE tbs03,PARTITION tsp_03 TABLESPACE test01,PARTITION tsp_04 TABLESPACE test01);b、插⼊数据INSERT INTO hr.system_partition01 VALUES(1,'A'); -errorSQL 错误: ORA-14701: 对于按“系统”⽅法进⾏分区的表, 必须对 DML 使⽤分区扩展名或绑定变量INSERT INTO hr.system_partition01 PARTITION(tsp_01) VALUES(1,'A'); --OK9、Composite Range-List Partitioning 联合分区,通过多个判断标准创建分区a、创建分区CREATE TABLE hr.trange_list01(orderid NUMBER PRIMARY KEY,order_date DATE NOT NULL,order_city VARCHAR2(20))PARTITION BY RANGE(order_date)SUBPARTITION BY LIST(order_city)(PARTITION tl_2020_q1 VALUES LESS THAN(to_date('20200401','yyyymmdd')) TABLESPACE USERS( --第⼀层通过时间range创建分区 SUBPARTITION tl_2020_q1_east VALUES('Shanghai','Jiangshu'), --第⼆层通过list创建分区SUBPARTITION tl_2020_q1_soutth VALUES('Guangzhou','Guangxi'),SUBPARTITION tl_2020_q1_west VALUES('Sichuan','Guizhou'),SUBPARTITION tl_2020_q1_north VALUES('Beijing','Henan'),SUBPARTITION tl_2020_q1_other VALUES(default)),PARTITION tl_2020_q2 VALUES LESS THAN(to_date('20200701','yyyymmdd')) TABLESPACE TEST01(SUBPARTITION tl_2020_q2_east VALUES('Shanghai','Jiangshu','Zhejiang'),SUBPARTITION tl_2020_q2_soutth VALUES('Guangzhou','Guangxi'),SUBPARTITION tl_2020_q2_west VALUES('Sichuan','Guizhou','Yunyan'),SUBPARTITION tl_2020_q2_north VALUES('Beijing','Henan','Hebei'),SUBPARTITION tl_2020_q2_other VALUES(default)),PARTITION tl_2020_q3 VALUES LESS THAN(to_date('20201001','yyyymmdd')) TABLESPACE TBS02(SUBPARTITION tl_2020_q3_east VALUES('Shanghai','Jiangshu','Zhejiang'),SUBPARTITION tl_2020_q3_soutth VALUES('Guangzhou','Guangxi'),SUBPARTITION tl_2020_q3_west VALUES('Sichuan','Guizhou','Yunyan'),SUBPARTITION tl_2020_q3_north VALUES('Beijing','Henan','Hebei'),SUBPARTITION tl_2020_q3_other VALUES(default)),PARTITION tl_2020_q4 VALUES LESS THAN(to_date('20210101','yyyymmdd')) TABLESPACE USERS(SUBPARTITION tl_2020_q4_east VALUES('Shanghai','Jiangshu','Zhejiang'),SUBPARTITION tl_2020_q4_soutth VALUES('Guangzhou','Guangxi'),SUBPARTITION tl_2020_q4_west VALUES('Sichuan','Guizhou','Yunyan'),SUBPARTITION tl_2020_q4_north VALUES('Beijing','Henan','Hebei'),SUBPARTITION tl_2020_q4_other VALUES(default)));10、分区表的分区索引(最好就建local索引,⼀个分区对应⼀个分区索引)分区索引分为两种本地索引 local index 分区索引全局索引 global index 可以选择是否分区分区索引使⽤前缀的分区索引分区索引有前缀prefix的分区索引分区的索引必须包含分区键并且作为引导列的索引⽆前缀prefix的分区索引字典解析desc dba_part_indexesDBA_PART_INDEXES displays the object-level partitioning information for all partitioned indexes in the database.LOCALITY Indicates whether the partitioned index is local (LOCAL) or global (GLOBAL)desc dba_ind_partitionsDBA_IND_PARTITIONS describes all index partitions in the database.--创建全局分区索引CREATE INDEX hr.orders_id_global ON hr.orders(orders_date) GLOBAL ---引导列全局分区索引前缀PARTITION BY RANGE(orders_date) --分区键(PARTITION p1 VALUES LESS THAN(to_date('20200401','yyyymmdd')),PARTITION p2 VALUES LESS THAN(to_date('20200701','yyyymmdd')),PARTITION p3 VALUES LESS THAN(to_date('20201001','yyyymmdd')),PARTITION p4 VALUES LESS THAN(to_date('20210101','yyyymmdd')),PARTITION p5 VALUES LESS THAN(to_date('20210401','yyyymmdd')),PARTITION p6 VALUES LESS THAN(MAXVALUE));--local索引局部索引⼀定是分区索引分区键等于表的分区键CREATE INDEX hr.orders_idx_local ON hr.orders(orders_date) LOCAL;--分区索引ALTER INDEX index_name REBUILD PARTITION partition_name;Oracle⾃动维护分区索引,对于全局索引,对分区表进⾏操作,会导致整个全局索引失效,需要重建。
ORACLE数据库中PARTITION的用法
Oracle9i通过引入列表分区(List Partition),使得当前共有4种分区数据的方法,具体列出如下:第一种范围分区1 对表进行单列的范围分区:这使最为常用也是最简单的方法,具体例子如下:create table emp(empno number(4),ename varchar2(30),sal number)partition by range(empno)(partition e1 s less than (1000) tablespace emp1,partition e2 s less than (2000) tablespace emp2,partition e3 s less than (max) tablespace emp3);insert into emp s (100,Tom,1000);insert into emp s (500,Peter,2000);insert into emp s (1000,Scott,3000);insert into emp s (1999,Bill,4000);insert into emp s (5000,Gates,6000);commit;从emp表中选择全部的纪录如下:SQL> select * from emp;EMPNO ENAME SAL---------- ------------------------------ ----------100 Tom 1000500 Peter 20001000 Scott 30001999 Bill 40005000 Gates 6000还可以按照分区进行选择:SQL> select * from emp partition (e1);EMPNO ENAME SAL---------- ------------------------------ ----------100 Tom 1000500 Peter 2000SQL> select * from emp partition (e2)EMPNO ENAME SAL---------- ------------------------------ ----------1000 Scott 30001999 Bill 4000SQL> select * from emp partition (e3)EMPNO ENAME SAL---------- ------------------------------ ----------5000 Gates 6000使用了分区,还可以单独针对指定的分区进行truncate操作:alter table emp truncate partition e2;2 对表进行多列的范围分区:多列的范围分区主要是基于表中多个列的值的范围对数据进行分区,例如:drop table emp;create table emp(empno number(4),ename varchar2(30),sal number,day integer not null,month integer not null)partition by range(month,day)(partition e1 s less than (5,1) tablespace emp1,partition e2 s less than (10,2) tablespace emp2,partition e3 s less than (max,max) tablespace emp3);SQL> insert into emp s (100,Tom,1000,10,6);SQL> insert into emp s (200,Peter,2000,3,1);SQL> insert into emp s (300,Jane,3000,23,11);第二种Hash分区:hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中(问:hash算法是干什么的?呵呵,只能去看看数据结构了)hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀具体例子如下:drop table emp;create table emp (empno number(4),ename varchar2(30),sal number)partition by hash (empno)partitions 8store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);怎么样?很方便吧!第三种复合分区:这是一种将前两种分区综合在一起使用的方法,例如:drop table emp;create table emp (empno number(4),ename varchar2(30),hiredate date)partition by range (hiredate)subpartition by hash (empno)subpartitions 2(partition e1 s less than (to_date(20020501,YYYYMMDD)),partition e2 s less than (to_date(20021001,YYYYMMDD)),partition e3 s less than (max));上面的例子中将雇员表先按照雇佣时间hiredate进行了范围分区,然后再把每个分区分为两个子hash分区。
ORACLE PARTITION简介
范例2: create table Partition_RangeTest2( PID number not null, PITEM varchar2(200), PDATA date not null ) partition by range(PDATA)( partition part_t01 values less than(to_date('2004-01-01','yyyymm-dd')) tablespace partion_01, partition part_t02 values less than(to_date('2008-01-01','yyyymm-dd')) tablespace partion_02, partition part_t03 values less than(maxvalue) tablespace partion_03 ); 注意:MAXVALUE 是Oracle的关键字
删除分区里的数据
delete from Partition_Test1 partition(part_fh02) t where t.pid = '1961'
知识点
分区表的优点有哪些? 分区表的缺点有哪些?如何解决? Oracle分区方法有哪些? 如何创建范围分区表? 如何操作带有分区的表?
谢谢!
ORACLE PARTITION简介
二〇一〇年五月
一、Oracle分区简介
ORACLE的分区是一种处理超大型表的技术。 分区是一种“分而治之”,通过将大表分成可以管 理的小块,从而避免了对每个表作为一个大的、单 独的对象进行管理,为大量数据提供了可伸缩的性 能。分区通过将操作分配给更小的存储单元,减少 了需要进行管理操作的时间,并通过增强的并行处 理提高了性能,通过屏蔽故障数据的分区,还增加 了可用性。
关于oracle分区技术初了解 电脑资料
关于oracle分区技术初了解电脑资料
一、分区类型1.范围分区(RangePartitioning)
适用于连续/按时间排序的数据2.散列分区(HashPartitioning)
适用于不连续/数据记录固定的数据3.组合分区Range-Hash Range-List4.列表分区ListPartitioning
适用于对不连续域的数据分区更准确的控制数据的分区存储
适用于位置类数据二、分区表的维护
准备工作2.1删除表分区
2.2增加表分区增加分区的分区范围必须比当前分区的最后一个分区更高
2.3合并分区必须是相邻的范围分区
继承最大的范围边界2.4移动表分区
移动分区数据到另一个表空间重新数据减少碎片
改变物理属性2.5拆分表分区
拆分表分区———一个分区变的太大,导致备份,恢复和分区性能操作花费时间太长,重新分配I/O负载,。
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操作语句
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;
ORACLE数据库中PARTITION的用法
ORACLE数据库中PARTITION的用法Oracle9i通过引入列表分区(List Partition),使得当前共有4种分区数据的方法,具体列出如下:第一种范围分区1 对表进行单列的范围分区:这使最为常用也是最简单的方法,具体例子如下:create table emp(empno number(4),ename varchar2(30),sal number)partition by range(empno)(partition e1 s less than (1000) tablespace emp1,partition e2 s less than (2000) tablespace emp2,partition e3 s less than (max) tablespace emp3);insert into emp s (100,Tom,1000);insert into emp s (500,Peter,2000);insert into emp s (1000,Scott,3000);insert into emp s (1999,Bill,4000);insert into emp s (5000,Gates,6000);commit;从emp表中选择全部的纪录如下:SQL> select * from emp;EMPNO ENAME SAL---------- ------------------------------ ----------100 Tom 1000500 Peter 20001000 Scott 30001999 Bill 40005000 Gates 6000还可以按照分区进行选择:SQL> select * from emp partition (e1);EMPNO ENAME SAL---------- ------------------------------ ----------100 Tom 1000500 Peter 2000SQL> select * from emp partition (e2)EMPNO ENAME SAL---------- ------------------------------ ----------1000 Scott 30001999 Bill 4000SQL> select * from emp partition (e3)EMPNO ENAME SAL---------- ------------------------------ ----------5000 Gates 6000使用了分区,还可以单独针对指定的分区进行truncate操作:alter table emp truncate partition e2;2 对表进行多列的范围分区:多列的范围分区主要是基于表中多个列的值的范围对数据进行分区,例如:drop table emp;create table emp(empno number(4),ename varchar2(30),sal number,day integer not null,month integer not null)partition by range(month,day)(partition e1 s less than (5,1) tablespace emp1,partition e2 s less than (10,2) tablespace emp2,partition e3 s less than (max,max) tablespace emp3);SQL> insert into emp s (100,Tom,1000,10,6);SQL> insert into emp s (200,Peter,2000,3,1);SQL> insert into emp s (300,Jane,3000,23,11);第二种Hash分区:hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中(问:hash算法是干什么的?呵呵,只能去看看数据结构了)hash算法中最重要的是hash函数,Oracle中如果你要使用hash 分区,只需指定分区的数量即可建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀具体例子如下:drop table emp;create table emp (empno number(4),ename varchar2(30),sal number)partition by hash (empno)partitions 8store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);怎么样?很方便吧!第三种复合分区:这是一种将前两种分区综合在一起使用的方法,例如:drop table emp;create table emp (empno number(4),ename varchar2(30),hiredate date)partition by range (hiredate)subpartition by hash (empno)subpartitions 2(partition e1 s less than (to_date(20020501,YYYYMMDD)),partition e2 s less than (to_date(20021001,YYYYMMDD)),partition e3 s less than (max));上面的例子中将雇员表先按照雇佣时间hiredate进行了范围分区,然后再把每个分区分为两个子hash分区。
oracle表分区详解
oracle表分区详解Oracle表分区详解Oracle表分区是指将一张表(table)拆分为多个部分(partition),每个部分相互独立,根据不同的属性进行存储。
通过表分区,可以大幅提高查询效率和降低维护成本,也有助于加快数据库备份和恢复。
下面我们来详细了解一下Oracle表分区。
一、表分区的概念表分区是将一张大表(table)拆分为多个小表(partition)。
每个小表可以拥有自己独立的数据存储形式,这些小表可以根据一些共同的属性进行划分。
例如按时间,按地区进行划分。
通过表分区,可以实现多个子表之间的相互独立,从而降低维护成本,提高查询效率。
二、表分区的类型表分区可以分为水平分区和垂直分区两种类型。
1. 水平分区水平分区是将一张表根据某一属性分成多个分区,每个分区存储不同的数据。
常见的分区属性有时间、地区、业务范围等。
水平分区可以减少查询的数据量,提高查询效率,同时也可以降低备份和恢复的难度。
2. 垂直分区垂直分区是将一张表拆分成多个表,每个表存储不同的属性。
在垂直分区中,每张小表都包含唯一一些行数据,但是这些小表通过某些公共的列或者键连接起来。
垂直分区比较适合需要存储大型的或者变量长度的字段的表,可以有效的提高查询效率。
三、表分区的策略表分区的策略是根据表的特点选择分区方式。
表的分区策略可以采用以下几种方式:基于时间:按照时间划分,例如按天、按周、按月、按季度等。
基于列:按照列的属性划分,例如根据地区、类型、状态等进行划分。
基于范围:按照数值的范围划分,例如按价格、数量、面积等进行划分。
基于哈希:采用哈希算法划分,可以保证数据均衡,但是不适用于区间查询。
基于列表:根据给定的列值列表来定义分区。
四、表分区的优点表分区的优点包括以下几个方面:1. 提高查询效率:表分区可以减少查询的数据量,提高查询效率。
2. 便于备份和恢复:表分区可以将数据拆分开来,便于备份和恢复。
3. 分区维护简单:分区之间相互独立,可以进行单独的维护。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle 表分区 partition技术(转)2009年06月12日星期五 11:23一下内容转至:/blog/166078一、Oracle分区简介ORACLE的分区是一种处理超大型表、索引等的技术。
分区是一种“分而治之”的技术,通过将大表和索引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能。
分区通过将操作分配给更小的存储单元,减少了需要进行管理操作的时间,并通过增强的并行处理提高了性能,通过屏蔽故障数据的分区,还增加了可用性。
二、Oracle分区优缺点优点:λ增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
缺点:λ分区表相关:已经存在的表没有方法可以直接转化为分区表。
不过 Oracle 提供了在线重定义表的功能。
三、Oracle分区方法范围分区:λ范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
如根据序号分区,根据业务记录的创建日期进行分区等。
Hash分区(散列分区):λ散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O 设备上进行散列分区,使得这些分区大小一致。
λ List分区(列表分区):当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。
与范围分区和散列分区所不同,列表分区不支持多列分区。
如果要将表按列分区,那么分区键就只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的列,都可以用列表分区方法进行分区。
范围-散列分区(复合分区):λ有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。
复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法(注意:先一定要进行范围分区)范围-列表分区(复合分区):λ范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。
与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。
(注意:先一定要进行范围分区)四、Oracle表分区表操作--Partitioning 是否为trueselect * from v$option s order by s.PARAMETER desc--创建表空间CREATE TABLESPACE "PARTION_03"LOGGINGDATAFILE 'D:\ORACLE\ORADATA\JZHUA\PARTION_03.dbf' SIZE 50MEXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO--删除表空间drop tablespace partion_01--范围分区技术create table Partition_Test(PID number not null,PITEM varchar2(200),PDATA date not null)partition by range(PID)(partition part_01 values less than(50000) tablespace dinya_space01, partition part_02 values less than(100000) tablespace dinya_space02, partition part_03 values less than(maxvalue) tablespace dinya_space03 )create table Partition_TTest(PID number not null,PITEM varchar2(200),PDATA date not null)partition by range(PDATA)(partition part_t01 values less than(to_date('2004-01-01','yyyy-mm-dd')) tablespace dinya_space01,partition part_t02 values less than(to_date('2008-01-01','yyyy-mm-dd')) tablespace dinya_space02,partition part_t03 values less than(maxvalue) tablespace dinya_space03 )insert into Partition_Test(PID,PITEM,PDATA) selecth.id,erid,h.rectime from st_handle hselect * from Partition_Test partition(part_01) t where t.pid = '1961'--hash 分区技术create table Partition_HashTest(PID number not null,PITEM varchar2(200),PDATA date not null)partition by hash(PID)(partition part_h01 tablespace dinya_space01,partition part_h02 tablespace dinya_space02,partition part_h03 tablespace dinya_space03)insert into Partition_HashTest(PID,PITEM,PDATA) selecth.id,erid,h.rectime from st_handle hselect * from Partition_HashTest partition(part_h03) t where t.pid = '1961'--复合分区技术create table Partition_FHTest(PID number not null,PITEM varchar2(200),PDATA date not null)partition by range(PDATA) subpartition by hash(PID) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)(partition part_fh01 values lessthan(to_date('2004-01-01','yyyy-mm-dd')) tablespace dinya_space01, partition part_fh02 values lessthan(to_date('2008-01-01','yyyy-mm-dd')) tablespace dinya_space02, partition part_fh03 values less than(maxvalue) tablespace dinya_space03 )insert into Partition_FHTest(PID,PITEM,PDATA) selecth.id,erid,h.rectime from st_handle hselect * from Partition_FHTest partition(part_fh02) t where t.pid ='1961'select * from Partition_FHTest partition(part_fh03) t--速度比较select * from st_handle h where h.rectime >to_date('2008-01-01','yyyy-mm-dd');select * from Partition_FHTest partition(part_fh03) t where t.pdata > to_date('2008-01-01','yyyy-mm-dd');--分区表操作--增加一个分区alter table Partition_Test add partition part_05 values less than (10020) tablespace dinya_space03--查询分区数据select * from Partition_FHTest partition(part_fh02) t--修改分区里的数据update Partition_FHTest partition(part_fh02) t set t.PITEM = 'JZHUA' where t.pid = '1961'--删除分区里的数据delete from Partition_FHTest partition(part_fh02) t where t.pid = '1961'--合并分区create table Partition_HB(PID number not null,PITEM varchar2(200),PDATA date not null)partition by range(PID)(partition part_01 values less than(50000) tablespace dinya_space01, partition part_02 values less than(100000) tablespace dinya_space02, partition part_03 values less than(maxvalue) tablespace dinya_space03 )insert into Partition_HB(PID,PITEM,PDATA) selecth.id,erid,h.rectime from st_handle hselect * from Partition_HB partition(part_03) t where t.pid = '100001'alter table Partition_HB merge partitions part_01,part_02 into partition part_02;--拆分分区-- spilt partition 分区名 at(这里是一个临界区,比如:50000就是说小于50000的放在part_01,而大于50000的放在part_02中)alter table Partition_HB split Partition part_02 at (50000) into (Partition part_01 tablespace dinya_space01, Partition part_02 tablespace dinya_space02);--更改分区名alter table Partition_HB rename Partition part_01_test to part_02; 五、Oracle索引分区表操作分区表和一般表一样可以建立索引,分区表可以创建局部索引和全局索引。