oracle 建立分区表
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 按时间创建分区表首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。
当表的大小过G 的时候可以考虑进行表分区,提高查询效率,均衡IO 。
oracle 分区表是oracle 数据库提供的一种表分区的实现形式。
表进行分区后,逻辑上仍然是一张表,原来的查询SQL 同样生效,同时可以采用使用分区查询来优化SQL 查询效率,不至于每次都扫描整个表一、分区表基本操作1、按时间分区表创建:1 2 3 4 5 6 7 8 9 10 11 create table t_test (pk_id number(30) not null,add_date_time DATE,constraintPK_T_TEST primary key (pk_id))PARTITION BY RANGE (add_date_time)(PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS)其中add_date_time 为分区字段,每一年一个分区。
插入100W 数据1 2 3 4 5 6 7 declarei int := 1;yearVARCHAR2(20);beginloopyear := CASEmod(i, 3)WHEN 0 THEN8 9 10 11 12 13 14 15 16 17 18 '2012-01-14 12:00:00'WHEN 1 THEN'2013-01-14 12:00:00'ELSE'2014-01-14 12:00:00'END;insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss'));exit when i= 1000000;i := i + 1;end loop;end;查看分区表的分区的详细信息1 Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';2、分区表修改2.1增加一个分区分两种情况:1.没有maxvalue 分区。
Oracle分区表的新增、修改、删除、合并。普通表转分区表方法
Oracle分区表的新增、修改、删除、合并。
普通表转分区表⽅法⼀、分区概念Oracle允许将表、索引、索引组织表细分成更⼩的⽚,每个⽚我们称之为分区。
分区有其⾃⼰的名字和存储参数。
每⾏数据只能属于⼀个分区,分区键决定数据⾏属于哪个分区。
分区键由⼀个或多个列组成。
Oracle⾃动的将数据的DML操作映射到相应的分区中。
⼆、分区的优点:a.由于将数据分散到各个分区中,减少了数据损坏的可能性;b.可以对单独的分区进⾏备份和恢复;c.可以将分区映射到不同的物理磁盘上,来分散IO;d.提⾼可管理性、可⽤性和性能。
三、Oracle 10g提供了以下⼏种分区类型:a.范围分区(range);b.哈希分区(hash);c.列表分区(list);d.范围-哈希复合分区(range-hash);e.范围-列表复合分区(range-list)。
1.Range分区:Range分区是应⽤范围⽐较⼴的表分区⽅式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。
如按照时间划分,2021年1⽉的数据放到a分区,2⽉的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。
在按时间分区时,如果某些记录暂⽆法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。
如:create table pdba (id number, time date) partition by range (time)(partition p1 values less than (to_date('2021-10-1', 'yyyy-mm-dd')),partition p2 values less than (to_date('2021-11-1', 'yyyy-mm-dd')),partition p3 values less than (to_date('2021-12-1', 'yyyy-mm-dd')),partition p4 values less than (maxvalue))2.Hash分区:对于那些⽆法有效划分范围的表,可以使⽤hash分区,这样对于提⾼性能还是会有⼀定的帮助。
oracle分区表的建立方法
oracle分区表的建立方法Oracle的分区表能够包括多个分区,每个分区差不多上一个独立的段(SEGMENT),能够存放到不同的表空间中。
查询时能够通过查询表来访咨询各个分区中的数据,也能够通过在查询时直截了当指定分区的方法来进行查询。
分区提供以下优点:由于将数据分散到各个分区中,减少了数据损坏的可能性;能够对单独的分区进行备份和复原;能够将分区映射到不同的物理磁盘上,来分散IO;提高可治理性、可用性和性能。
Oracle提供了以下几种分区类型:范畴分区(range);哈希分区(hash);列表分区(list);范畴-哈希复合分区(range-hash);范畴-列表复合分区(range-list)。
Oracle的一般表没有方法通过修改属性的方式直截了当转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并讲明它们各自的特点。
方法一:利用原表重建分区表。
步骤:SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);表已创建。
SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;已创建6264行。
SQL> COMMIT;提交完成。
SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)2 (PARTITION P1 V ALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),3 PARTITION P2 V ALUES LESS THAN (TO_DA TE('2005-1-1', 'YYYY-MM-DD')),4 PARTITION P3 V ALUES LESS THAN (TO_DA TE('2005-7-1', 'YYYY-MM-DD')),5 PARTITION P4 V ALUES LESS THAN (MAXV ALUE))6 AS SELECT ID, TIME FROM T;表已创建。
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创建分区
(说明:分区的名称可以和表空间的名称不一致。这里是每个季度做一个分区,当然也可以每个月做一个分区)
3、IMPORT导入数据,参数ignore=y
4、分区表的扩容:
到了2001 年下半年,建立新的表空间:
create tablespace g_2001q3 datafile '/home/oradata/oradata/test/g_2001q3.dbf' size 50m default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);
为表添加新分区和表空间:
alter table guestbook add partition g_2001q3
values less than (to_date('2001-10-01','yyyy-mm-dd')
tablespace g_2001q3
storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0);
create tablespace g_2001q2 datafile '/home/oradata/oradata/test/g_2001q2.dbf' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1);
1 、以system 身份创建独立的表空间(大小可以根据数据量的多少而定)
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。
oracle建分区表语句
oracle建分区表语句Oracle建分区表语句是数据库管理中一个重要的操作。
分区表是将一个大表分成多个小表存储,以提高查询和维护效率。
当数据量很大时,使用分区表可以快速定位数据,提高查询速度。
下面我们来详细了解一下如何建立Oracle分区表。
一、创建表在使用Oracle建分区表之前,我们需要先创建表。
创建表的语句格式如下:CREATE TABLE table_name (column1 datatype1 [DEFAULT expr1],column2 datatype2 [DEFAULT expr2], ….) TABLESPACE tablespace_name;其中,table_name是要创建的表名,column是表的字段名,datatype是字段的数据类型,TABLESPACE是表空间的名称。
二、分区键分区键是将表分割成分区的重要依据。
分区键必须是表中的一个或多个列。
常用的分区键有日期和地点。
日期可以按月、季度、年等进行分区,地点可以按照省、市、县等进行分区。
分区键的类型应该是数字或日期。
建立分区键要使用PARTITION BY子句。
下面是分区键建表的语句:CREATE TABLE table_name (column1 datatype1 [DEFAULT expr1],column2 datatype2 [DEFAULT expr2], …. )PARTITION BY RANGE (column_name)(PARTITION partition_name1 VALUES LESS THAN (value1),PARTITION partition_name2 VALUES LESS THAN (value2),….)TABLESPACE tablespace_name;其中,TABLESPACE指定表所使用的表空间的名称,PARTITION BY 定义了分区的方式,RANGE是分区键的方式,(column_name)指定了按照哪个列进行划分。
oracle分区表的建立方法
oracle分区表的建立方法1.创建分区表前的准备工作在创建分区表之前,需要先创建一个分区表所依赖的分区表空间。
分区表空间是专门用于存储分区表数据的空间。
可以使用以下语句创建分区表空间:```sqlCREATE TABLESPACE tablespace_name DATAFILE'path_to_datafile' SIZE size;```其中,tablespace_name为分区表空间的名称,path_to_datafile为数据文件的路径和文件名,size为分区表空间的大小。
2.创建分区表在创建分区表之前,需要先确定表的结构和分区键。
分区键是用来确定数据如何在表的分区之间分布的关键字。
可以使用以下语句创建分区表:```sqlCREATE TABLE table_namecolumn1 datatype [DEFAULT expr ][column_constraint]...column_n datatype [DEFAULT expr ][column_constraint]PARTITION BY RANGE (column_name)PARTITION partition1 VALUES LESS THAN (value1),PARTITION partition2 VALUES LESS THAN (value2),...PARTITION partitionn VALUES LESS THAN (valuen)TABLESPACE tablespace_name;```其中,table_name为表的名称,column1到column_n为列的名称,datatype为列的数据类型,DEFAULT expr为列的默认值,column_constraint为列的约束条件,column_name为分区键的列名,partition1到partitionn为各个分区的名称,value1到valuen为分区键的取值范围,tablespace_name为分区表使用的分区表空间。
Oracle 建立分区表
Oracle 建立分区表在Oracle 11g数据库中,根据对表或索引的分区方法可以创建五种类型的分区表:范围分区、散列分区、列表分区、组合范围散列分区和组合范围列表分区。
每种分区表都有自己的特点,在创建分区表时,应当根据表应用情况选择合理的分区类型。
1.范围分区表范围分区就是根据分区字段的取值范围进行分区,将数据存储在不同的分区段中。
如果表的数据可以按照逻辑范围进行划分,并在不同范围内分布比较均衡,那么可以使用范围分区。
例如,根据日期值进行分区,将不同日期的数据存储在不同的分区上。
如图10-2所示,假设有一个销售表SALES,该表的数据总量达到1000G,每个季度平均250G。
如果使用普通表存储数据,那么1000G数据会存放到一个表段SALES中,那么在统计一季度销售数据时需要扫描1000G数据;如果使用分区表,则可以将一、二、三、四季度数据分别存放到不同分区段中,此时统计一季度销售数据时只需要扫描250G的数据。
显而易见,使用范围分区可以大大降低I/O次数,从而提高了磁盘I/O性能。
普通表分区表一季度销售数据二季度销售数据三季度销售数据四季度销售数据图10-2 分区表与普通表例如,下面的示例建立一个范围分区表,将每个季度的销售数据部署到不同的表分区段。
建立范围分区时,必须指定分区方法RANGE,分区列以及每个分区列值的具体范围。
示例如下:SQL> create table sales_range(2 customer_id number(3),3 sales_amount number(10,2),4 sales_date date not null5 )partition by range(sales_date)(6 partition part_01 values less than(to_date('2008-04-01','yyyy-mm-dd')) tablespace space01,7 partition part_02 values less than(to_date('2008-07-01','yyyy-mm-dd')) tablespace space02,8 partition part_03 values less than(to_date('2008-10-01','yyyy-mm-dd')) tablespace space03,9 partition part_o4 values less than(maxvalue) tablespace space0410 );表已创建。
oracle创建分区表技巧
oracle创建分区表技巧
创建分区表是Oracle数据库中常见的操作,它可以帮助我们更有效地管理数据。
下面是一些创建分区表的技巧:
1.选择合适的分区键,分区键是根据其值对表中的数据进行分区的依据。
在选择分区键时,应该考虑到数据的访问模式、查询需求以及数据的增长趋势。
通常情况下,选择一个经常被用来查询或者过滤数据的列作为分区键是一个不错的选择。
2.合理划分分区,在创建分区表时,需要根据实际情况合理划分分区。
可以根据时间范围、地理位置或者业务类型等因素来进行分区。
合理的分区设计可以提高查询性能,减少维护成本。
3.使用局部索引,在分区表中,可以选择在每个分区上创建局部索引,这样可以提高查询性能。
局部索引只包含特定分区中的数据,可以减少索引的大小,提高查询效率。
4.考虑分区交换加载,分区表在数据加载时可以使用分区交换加载的技术,这样可以大大减少数据加载的时间。
通过分区交换加载,可以将数据加载到临时表中,然后通过交换分区的方式快速将
数据加载到分区表中。
5.定期维护分区,创建分区表后,需要定期进行分区的维护工作,包括分区的合并、拆分、刷新等操作,以保证分区表的性能和
可用性。
总的来说,创建分区表需要根据实际情况选择合适的分区键,
合理划分分区,使用局部索引,考虑分区交换加载,并定期维护分区。
这些技巧可以帮助我们更好地利用Oracle数据库的分区表功能。
Oracle11g分区表创建(自动按年、月、日分区)
Oracle11g分区表创建(⾃动按年、⽉、⽇分区)前⾔:⼯作中有⼀张表⼀年会增长100多万的数据,量虽然不⼤,可是表字段多,所以⼀年下来也会达到 1G,⽽且只增不改,故考虑使⽤分区表来提⾼查询性能,提⾼维护性。
11g ⽀持⾃动分区,不过得在创建表时就设置好分区。
如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了。
⼀、为什么要分区(Partition) 1、⼀般⼀张表超过2G的⼤⼩,ORACLE是推荐使⽤分区表的。
2、这张表主要是查询,⽽且可以按分区查询,只会修改当前最新分区的数据,对以前的不怎么做删除和修改。
3、数据量⼤时查询慢。
4、便于维护,可扩展:11g 中的分区表新特性:Partition(分区)⼀直是 Oracle 数据库引以为傲的⼀项技术,正是分区的存在让Oracle ⾼效的处理海量数据成为可能,在 Oracle 11g 中,分区技术在易⽤性和可扩展性上再次得到了增强。
5、与普通表的 sql ⼀致,不需要因为普通表变分区表⽽修改我们的代码。
⼆、oracle 11g 如何按天、周、⽉、年⾃动分区2.1 按年创建numtoyminterval(1, 'year')--按年创建分区表create table test_part(ID NUMBER(20) not null,REMARK VARCHAR2(1000),create_time DATE)PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));--创建主键alter table test_part add constraint test_part_pk primary key (ID) using INDEX;-- Create/Recreate indexescreate index test_part_create_time on TEST_PART (create_time);2.2 按⽉创建numtoyminterval(1, 'month')--按⽉创建分区表create table test_part(ID NUMBER(20) not null,REMARK VARCHAR2(1000),create_time DATE)PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));--创建主键alter table test_part add constraint test_part_pk primary key (ID) using INDEX;2.3 按天创建NUMTODSINTERVAL(1, 'day')--按天创建分区表create table test_part(ID NUMBER(20) not null,REMARK VARCHAR2(1000),create_time DATE)PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL(1, 'day')) (partition part_t01 values less than(to_date('2018-11-12', 'yyyy-mm-dd')));--创建主键alter table test_part add constraint test_part_pk primary key (ID) using INDEX;2.4 按周创建NUMTODSINTERVAL (7, 'day')--按周创建分区表create table test_part(ID NUMBER(20) not null,REMARK VARCHAR2(1000),create_time DATE)PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL (7, 'day')) (partition part_t01 values less than(to_date('2018-11-12', 'yyyy-mm-dd')));--创建主键alter table test_part add constraint test_part_pk primary key (ID) using INDEX;2.5 测试可以添加⼏条数据来看看效果,oracle 会⾃动添加分区。
oracle 分区表创建语句
oracle 分区表创建语句摘要:1.Oracle 分区表的概述2.Oracle 分区表的创建方法3.Oracle 分区表的优点4.Oracle 分区表的注意事项正文:1.Oracle 分区表的概述Oracle 分区表是Oracle 数据库中的一种特殊表类型,它将数据分散存储在多个物理存储设备上,以提高查询效率和数据管理灵活性。
分区表可以将数据根据某个或多个列的值进行划分,每个划分区域称为一个分区。
这样可以将大量数据分散到不同的存储设备上,避免单点故障,同时减少查询时的I/O 操作,提高查询性能。
2.Oracle 分区表的创建方法创建Oracle 分区表的基本语法如下:```CREATE TABLE (table_name,partition_name)PARTITION BY RANGE (column_name START TO END)(PARTITION_NAME1 VALUES LESS THAN (VALUE1),PARTITION_NAME2 VALUES LESS THAN (VALUE2),...);```其中,`table_name`是要创建的分区表的名称,`partition_name`是分区的名称,`column_name`是用于分区的列名,`START`和`END`是列值的范围,`PARTITION_NAME1`、`PARTITION_NAME2`等是分区的别名,`VALUE1`、`VALUE2`等是分区的边界值。
例如,创建一个根据日期列分区的分区表:```CREATE TABLE dates (date_partition)PARTITION BY RANGE (date_column START TO END)(PARTITION date_partition_1 VALUES LESS THAN (TO_DATE("2022-01-01", "YYYY-MM-DD")),PARTITION date_partition_2 VALUES LESS THAN (TO_DATE("2023-01-01", "YYYY-MM-DD")),...);```3.Oracle 分区表的优点Oracle 分区表具有以下优点:(1) 提高查询性能:分区表可以将大量数据分散到不同的存储设备上,减少查询时的I/O 操作,提高查询性能。
oracle创建分区表
oracle创建分区表创建分区create table pt_range_list_test(pid number(10),pname varchar2(30),sex varchar2(10),create_date date) partition by range(create_date)subpartition by list(sex)(partition p1 values less than(to_date('2020-01-01', 'YYYY-MM-DD')) tablespace tetstbs1(subpartition sub1p1 values('MAN') tablespace tetstbs1,subpartition sub2p1 values('WOMAN') tablespace tetstbs1,subpartition sub3p1 values(default) tablespace tetstbs1),partition p2 values less than(to_date('2021-01-01', 'YYYY-MM-DD')) tablespace tetstbs2(subpartition sub1p2 values('MAN') tablespace tetstbs2,subpartition sub2p2 values('WOMAN') tablespace tetstbs2,subpartition sub3p2 values(default) tablespace tetstbs2),partition p3 values less than(maxvalue) tablespace tetstbs3(subpartition sub1p3 values('MAN') tablespace tetstbs3,subpartition sub2p3 values('WOMAN') tablespace tetstbs3,subpartition sub3p3 values(default) tablespace tetstbs3)) enable row movement;局部索引-- 创建测试分区表create table local_index_example(id number(2),name varchar2(50),sex varchar2(10))partition by range (id)(partition part_1 values less than (5),partition part_2 values less than (10))--创建局部前缀索引;分区键(id)作为索引定义的第⼀列create index local_prefixed_index on local_index_example (id, name) local;--创建局部⾮前缀索引;分区键未作为索引定义的第⼀列create index local_nonprefixed_index on local_index_example (name, id) local;注意:判断局部索引是前缀还是⾮前缀的只需要看分区键是否作为索引定义的第⼀列①: select … from local_index_example where id = :id and name = :name;②: select … from local_index_example where name = :name;对于以上两个查询来说,如果查询第⼀步是⾛索引的话,则:局部前缀索引 local_prefixed_index 只对①有⽤;局部⾮前缀索引 local_nonprefixed_index 则对①和②均有⽤;如果你有多个类似①和②的查询的话,则可以考虑建⽴局部⾮前缀索引;如果平常多使⽤查询①的话,则可以考虑建⽴局部前缀索引;总之,重点是你要尽可能保证查询包含的谓词允许索引分区消除全剧索引对于全局分区索引来说,索引的实际分区数可能不同于表的分区数量;全局索引的分区机制有别于底层表,例如表可以按 done_date 列划分为10个分区,表上的⼀个全局索引可以按 id 列划分为5个分区。
oracle 建立分区表
oracle 建立分区表从上次在亚旭培训的时候,我和dba讨论一次我开发系统中为了一张表不是非常的大,采用了动态sql创建多个部门的表,然后存取相应的数据,从而解决了一张表过大的问题。
当时dba和我说了分区表,我第一感觉,如果当时我知道数据库还有这种表,那我当时开发起来应该轻松的多,后来就一直有个想法,去了解分区表,因为最近自己一直都比较忙,被琐事所困,今天晚上终于抽出了点时间,了解了相关的知识,并做了400多w条数据的一个分区表的测试。
一.范围分区范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。
1 2 3 4 5 6 7 8 9101112 --例一取值范围:CREATE TABLE CUSTOMER(CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME VARCHAR2(30) NOT NULL,LAST_NAME VARCHAR2(30) NOT NULL,PHONE VARCHAR2(15) NOT NULL,EMAIL VARCHAR2(80),STATUS CHAR(1))PARTITION BY RANGE (CUSTOMER_ID)(13141516171819202122232425262728293031 PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02,PARTITION CUS_PART3 VALUES LESS THEN(MAXVALUE) TABLESPACE CUS_TS02)--例二按时间划分(随着时间的增长,还需要添加分区表):CREATE TABLE ORDER_ACTIVITIES(ORDER_ID NUMBER(7) NOT NULL,ORDER_DATE DATE,TOTAL_AMOUNT NUMBER,CUSTOTMER_ID NUMBER(7),PAID CHAR(1))PARTITION BY RANGE (ORDER_DATE)(PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY-2003','DD-MON-YYYY')) TABLESPACE ORD_TS01,PARTITION ORD_ACT_PART02 VALUES LESS THAN(TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,PARTITION ORD_ACT_PART03 VALUES LESS THAN(TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03)1 2 3 4 5 6 --这个是我在自己电脑上测试的实例,一个sql竞赛的资料库中的数据create table p_t2(a1 number,a2 varchar2(10),a3 varchar2(30),a4 varchar2(10),a5 number)partition by list(a2)(partition p_tcp values('tcp') tablespace p1,partition p_udp values('udp') tablespace p2,partition p_icmp values('icmp') tablespace p3)三.散列分区这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。
(Oracle)已有数据表建立表分区—在线重定义
(Oracle)已有数据表建⽴表分区—在线重定义今天在做数据抽取的时候,发现有⼀张业务表数据量达到了5000W,所以就想将此表改为分区表。
分区表的有点如下:1、改善查询性能:对分区对象的查询可以仅搜索⾃⼰关⼼的分区,提⾼检索速度。
2、增强可⽤性:如果表的某个分区出现故障,表在其他分区的数据仍然可⽤;3、维护⽅便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
第⼀步:⾸先对要在线重定义的表⾃⾏验证,看该表是否可以重定义,如果不可以则会提⽰错误信息SQL>execute dbms_redefinition.can_redef_table('CDR','HDSD00_0203_ZYFYMXB');PL/SQL procedure successfully completed.第⼆步:建⽴和源表⼀样的分区表。
建表语句过长就不粘贴在此处了,这⼀步可以⽤pl/sql⼯具登录建表,避免在SQLPLUS环境下把表建⽴到sys⽤户下,导致找不到表。
第三步:执⾏表的在线重定义;SQL>execute dbms_redefinition.start_redef_table('CDR','HDSD00_0203_ZYFYMXB','HDSD00_0203_ZYFYMXB_BAK');PL/SQL procedure successfully completed.第四步:执⾏中间表和数据源表的数据同步。
SQL>execute dbms_redefinition.sync_interim_table('CDR','HDSD00_0203_ZYFYMXB','HDSD00_0203_ZYFYMXB_BAK');PL/SQL procedure successfully completed.第五步:执⾏结束在线定义过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle 建立分区表
从上次在亚旭培训的时候,我和dba讨论一次我开发系统中为了一张表不是非常的大,采用了动态sql创建多个部门的表,然后存取相应的数据,从而解决了一张表过大的问题。
当时dba和我说了分区表,我第一感觉,如果当时我知道数据库还有这种表,那我当时开发起来应该轻松的多,后来就一直有个想法,去了解分区表,因为最近自己一直都比较忙,被琐事所困,今天晚上终于抽出了点时间,了解了相关的知识,并做了400多w条数据的一个分区表的测试。
一.范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。
1 2 3 4 5 6 7 8 9
10
11
12 --例一取值范围:
CREATE TABLE CUSTOMER
(
CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME VARCHAR2(30) NOT NULL,
LAST_NAME VARCHAR2(30) NOT NULL,
PHONE VARCHAR2(15) NOT NULL,
EMAIL VARCHAR2(80),
STATUS CHAR(1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02,
PARTITION CUS_PART3 VALUES LESS THEN(MAXVALUE) TABLESPACE CUS_TS02
)
--例二按时间划分(随着时间的增长,还需要添加分区表):
CREATE TABLE ORDER_ACTIVITIES
(
ORDER_ID NUMBER(7) NOT NULL,
ORDER_DATE DATE,
TOTAL_AMOUNT NUMBER,
CUSTOTMER_ID NUMBER(7),
PAID CHAR(1)
)
PARTITION BY RANGE (ORDER_DATE)
(
PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY
-2003','DD-MON-YYYY')) TABLESPACE ORD_TS01,
PARTITION ORD_ACT_PART02 VALUES LESS THAN
(TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
PARTITION ORD_ACT_PART03 VALUES LESS THAN
(TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
)
1 2 3 4 5 6 --这个是我在自己电脑上测试的实例,一个sql竞赛的资料库中的数据
create table p_t2(a1 number,a2 varchar2(10),a3 varchar2(30),a4 varchar2(10),a5 number)
partition by list(a2)
(partition p_tcp values('tcp') tablespace p1,
partition p_udp values('udp') tablespace p2,
partition p_icmp values('icmp') tablespace p3)
三.散列分区
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。
当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O 设备上进行散列分区,使得这些分区大小一致。
1 2 3 4 5 6 7 CREATE TABLE HASH_TABLE (
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL) (
8 9
10
11
12
13
14
15
16
17
18
19
20 PARTITION PART01 TABLESPACE HASH_TS01,
PARTITION PART02 TABLESPACE HASH_TS02,
PARTITION PART03 TABLESPACE HASH_TS03
)
--简写:
CREATE TABLE emp
(
empno NUMBER (4),
ename VARCHAR2 (30),
sal NUMBER
)
PARTITION BY HASH (empno) PARTITIONS 8
STORE IN(emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
1 2 3 4 5 CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10),
6 7 8 9
10
11
12
13
14
15
16
17
18
19
20 STATUS VARCHAR2(20)
)
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
(
PARTITION P1 VALUES LESS
THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
(
SUBPARTITION P1SUB1 VALUES('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P1SUB2 VALUES('INACTIVE') TABLESPACE rptfact2009
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
(
SUBPARTITION P2SUB1 VALUES('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P2SUB2 VALUES('INACTIVE') TABLESPACE rptfact2009
)
)
五.复合范围散列分区
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。
1 2 3 4 5 6 7 8 9
10
11
12
13 create table dinya_test
(
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300),
transaction_date date
)
partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
(
partition part_01 values less
than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
partition part_02 values less
tha n(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
partition part_03 values less than(maxvalue)
);。