oracle分区表自动添加分区

合集下载

oracle动态创建分区语法

oracle动态创建分区语法

oracle动态创建分区语法Oracle数据库中提供了动态创建分区的语法,这种方式可以让我们在进行分区表的查询和管理时更加灵活和高效。

在本篇文章中,我将为大家详细讲解Oracle动态创建分区语法的操作步骤及注意事项。

步骤一:确定分区键值类型在使用Oracle动态创建分区语法之前,我们需要先确定分区键值的类型。

常见的分区键值类型包括数字、日期、字符等。

不同的类型需要使用不同的语法进行分区。

步骤二:创建分区表在创建分区表时,我们需要定义分区键和分区类型。

分区键通常是表中的某一列,而分区类型则是我们在第一步中确定的分区键值类型。

例如,如果我们要以日期为分区键值类型,则分区类型应该是“按日期分区”。

使用动态创建分区语法时,我们可以在创建分区表的DDL语句中包含“PARTITION BY RANGE”或“PARTITION BY LIST”等关键字,以定义相应的分区方式。

步骤三:动态创建分区使用Oracle动态创建分区语法时,我们可以使用ALTER TABLE 语句进行操作。

下面是根据日期动态创建分区的例子:ALTER TABLE orders ADD PARTITION order_part_20210101 VALUES LESS THAN(TO_DATE('20210101','YYYYMMDD'));上述语句的意思是,在orders表中动态创建一个名为“order_part_20210101”的分区,该分区的分区键值小于“20210101”。

当我们需要创建更多的分区时,只需要通过ALTER TABLE语句重复上述步骤即可。

需要注意的是,在动态创建分区时,我们需要按照正确的分区键值范围进行创建,否则可能会导致查询结果不准确。

总结:Oracle提供了动态创建分区的语法,可以让我们更加灵活高效地进行分区表的管理和查询。

使用该方法时,我们需要确定分区键值类型、创建分区表并使用ALTER TABLE语句进行动态创建分区。

oracle表分区创建

oracle表分区创建

oracle表分区创建⼀、什么是分区表表分区有以下优点:1、数据查询:数据被存储到多个⽂件上,减少了I/O负载,查询速度提⾼。

2、数据修剪:保存历史数据⾮常的理想。

3、备份:将⼤表的数据分成多个⽂件,⽅便备份和恢复。

4、并⾏性:可以同时向表中进⾏DML操作,并⾏性性能提⾼,均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

5、增强可⽤性:如果表的某个分区出现故障,表在其他分区的数据仍然可⽤;6、维护⽅便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;7、改善查询性能:对分区对象的查询可以仅搜索⾃⼰关⼼的分区,提⾼检索速度。

8、需要注意的是包含LONG、LONGRAW数据类型的表不能分区,如果表格⼤于2G需要考虑分区。

⼆、分区表的种类1、RANGE 范围分区说明:针对记录字段的值在某个范围。

规则:(1)、每⼀个分区都必须有⼀个VALUES LESS THEN⼦句,它指定了⼀个不包括在该分区中的上限值。

分区键的任何值等于或者⼤于这个上限值的记录都会被加⼊到下⼀个⾼⼀些的分区中。

(2)、所有分区,除了第⼀个,都会有⼀个隐式的下限值,这个值就是此分区的前⼀个分区的上限值。

(3)、在最⾼的分区中,MAXVALUE被定义。

MAXVALUE代表了⼀个不确定的值。

这个值⾼于其它分区中的任何分区键的值,也可以理解为⾼于任何分区中指定的VALUE LESS THEN的值,同时包括空值。

若不添加maxvalue的分区插⼊数值⼀旦超过设置的最⼤上限会报错。

例⼀,按date范围创建分区表CREATE TABLE PART_TAB_CUSTOMER_BY_RANGE(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),SEX VARCHAR2(10),STATUS VARCHAR2(10),INSERT_DATE DATE)PARTITION BY RANGE (INSERT_DATE) --按时间分区(PARTITION DATE_RANGE1 VALUES LESS THAN (TO_DATE(' 2001-01-01', 'YYYY-MM-DD')) TABLESPACE part_Data1,PARTITION DATE_RANGE2 VALUES LESS THAN (TO_DATE(' 2007-01-01', 'YYYY-MM-DD')) TABLESPACE part_Data2,PARTITION DATE_RANGE3 VALUES LESS THAN (maxvalue) TABLESPACE part_Data3)例⼆、按照number范围分区PARTITION BY RANGE (CUSTOMER_ID) --按id分区(PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE part_Data1,PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE part_Data2,PARTITION CUS_PART2 VALUES LESS THAN (maxvalue) TABLESPACE part_Data3)2、LIST 列表分区说明:该分区的特点是某列的值只有有限个值,基于这样的特点我们可以采⽤列表分区。

Oracle数据库分区表操作方法

Oracle数据库分区表操作方法

Oracle数据库分区表操作方法摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。

在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。

虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

使用分区的优点:·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

Oracle数据库提供对表或索引的分区方法有三种:·范围分区·Hash分区(散列分区)·复合分区下面将以实例的方式分别对这三种分区方法来说明分区表的使用。

为了测试方便,我们先建三个表空间。

以下为引用的内容:create tablespace dinya_space01datafile ’/test/demo/oracle/demodata/dinya01.dnf’ size 50Mcreate tablespace dinya_space01datafile ’/test/demo/oracle/demodata/dinya02.dnf’ size 50Mcreate tablespace dinya_space01datafil e ’/test/demo/oracle/demodata/dinya03.dnf’ size 50M1.1. 分区表的创建1.1.1. 范围分区范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。

oracle表分区增加分区

oracle表分区增加分区

oracle表分区增加分区昨天发现车辆轨迹库的表分区⽤完了,连夜加了分区,我们存轨迹的这张表建分区的时候按⽇期建只到2012-10-15,分区名从TAB_GPSBUSHIS_P1....TAB_GPSBUSHIS_P999,从2012-10-15开始的数据就默认都存在了TAB_GPSBUSHIS_P1000,所以现在的任务就是从2012-10-16开始继续建分区。

为了分区的序号连续性,我先将maxvalue对应的分区改了个名alter table tab_gpsbushis rename partition tab_gpsbushis_p1000 to tab_gpsbushis_pmax增加分区的命令alter table tab_gpsbushis add partition TAB_GPSBUSHIS_P1000 values less than (TO_DATE(' 2012-10-16 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));Woops,报错了报这个因为你建了maxvalue的分区,就会报错(我后来把这个分区的数据转移掉了,还是不⾏,所以我想是不是只要建了maxvalue的分区就不能继续增加分区了)于是就google,终于找到热⼼⽹友的解决之道,先split,把这⾥的数据转移掉,我这⾥的情况是2012-10-15发现分区不够了,所以maxvalue 对应的分区只存了2012-10-15的轨迹数据(还有⼀些不合法的⽇期的数据),我是这样split的:alter table TAB_GPSBUSHISsplit partition TAB_GPSBUSHIS_PMAX at (TO_DATE(' 2012-10-16 00:00:00', 'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN'))into (partition TAB_GPSBUSHIS_P1000, partition TAB_GPSBUSHIS_PMAX)如果你2012-10-20发现的,你应该就这样写了alter table TAB_GPSBUSHISsplit partition TAB_GPSBUSHIS_PMAX at (TO_DATE(' 2012-10-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN'))into (partition TAB_GPSBUSHIS_P1000, partition TAB_GPSBUSHIS_PMAX)再查看表属性中的分区就会发现多了TAB_GPSBUSHIS_P1000这个分区,查TAB_GPSBUSHIS_PMAX分区下的数据确实就只剩下些⾮法数据了,就可以全delete掉了这时候再执⾏那个add partition操作还是报同样的错,所以我就⼲脆把maxvalue对应的分区给drop掉了ALTER TABLE tab_gpsbushis DROP PARTITION tab_gpsbushis_pmax ;然后再执⾏add partition操作,ok成功了然后就拼命加啊,加啊,加到了2012-12-31,就先加到这吧最后⼜把maxvalue对应的分区加上了,alter table tab_gpsbushis add partition tab_gpsbushis_pmax values less than (maxvalue).ok,结束。

oracle表加分区语句

oracle表加分区语句

要向Oracle表添加分区,可以使用ALTER TABLE语句结合ADD PARTITION子句。

以下是示例语法:
sql
ALTER TABLE table_name
ADD PARTITION partition_name
VALUES LESS THAN (partition_value)
TABLESPACE tablespace_name;
在上面的语法中,你需要替换以下部分:
table_name:要添加分区的表名。

partition_name:新分区的名称。

partition_value:用于指定分区范围的值。

tablespace_name:存储分区数据的表空间名称。

请注意,这只是示例语法,具体的语句可能因你的表结构和需求而有所不同。

在实际使用时,你需要根据自己的情况进行适当的修改和调整。

另外,添加分区可能需要一些额外的步骤,如创建分区索引、更新全局索引等,这些步骤取决于你的具体情况和需求。

最后,强烈建议在执行任何DDL(数据定义语言)操作之前,先备份你的数据或在测试环境中进行验证,以避免意外数据损失或破坏。

Oracle中分区表

Oracle中分区表

Oracle中分区表 分区表就是通过使⽤分区技术,将⼀张⼤表,拆分成多个表分区(独⽴的segment),从⽽提升数据访问的性能,以及⽇常的可维护性。

 分区表分为 : 范围分区(range),列表分区(list),散列分区(hash),复合分区,交换分区 数据库的逻辑结构 : 表空间tablspace,段segment,区extent,块block 可以对分区表进⾏ : insert , update ,delete 需要注意:虽然各个分区可以存放在不同的表空间中,但这些表空间所使⽤的块⼤⼩必须⼀致。

分区表是建表之初建⽴的,不能后期添加1.RANGE(范围分区) 范围分区 : 按照范围进⾏分区,通常是按照字段分区,⽐如申请时间,⼊职时间等...创建语法:CREATE TABLE 表名( 列名数据类型,....)PARTITION BY RANGE (字段)( PARTITION 分区名1 VALUES LESS THAN (值1或⽇期1),PARTITION 分区名2 VALUES LESS THAN (值2或⽇期2),PARTITION 分区名3 VALUES LESS THAN (值3或⽇期3),PARTITION 分区名4 VALUES LESS THAN (MAXVALUE));/* VALUSE LESS THAN 特点 :VALUES < 值1VALUES >= 值1 AND VALUES < 值2VALUES >= 值2 AND VALUES < 值3VALUES >= 值3 AND VALUES < 值4....*/--新增分区 : ⾸先表⼀定要是分区表才可以新增--新增分区⾼于最后⼀个分区界限新增语法:ALTER TABLE 表名 ADD PSRTITION 分区名VALUES LESS THAN (值或⽇期);删除语法:ALTER TABLE 表名 GROP PARTITION 分区名;查询语法:SELECT <SELECT_LIST> FROM 表名 PARTITION(分区名);注意 : 除明确要求,尽量不要使⽤"MAXVALUE"2.LIST(列表分区)列表分区 : 按照列表分区,例如⾝份证号最后⼀位等创建语法:CREATE TABLE 表名( 列名数据类型,....)PARTITION BY LIST (字段)( PARTITION 分区名1 VALUES (值1),PARTITION 分区名2 VALUES (值2),PARTITION 分区名3 VALUES (值3));新增语法:ALTER TABLE 表名 ADD PSRTITION 分区名 VALUES (值);删除语法:ALTER TABLE 表名 GROP PARTITION 分区名;查询语法:SELECT <SELECT_LIST> FROM 表名 PARTITION(分区名);3.HESH(散列分区或哈希分区)实际结论见下:1. 数据随机插⼊Hash分区⼀般是在分区键值⽆法确定的情况下,使⽤的⼀种分区策略,Oracle按照hash 算法把数据插⼊⽤户指定的分区键中,它是随机的插⼊到某个区中,不受⼈为的⼲预。

Oracle数据库教程 ——oracle 分区表详解

Oracle数据库教程 ——oracle 分区表详解

Oracle数据库教程——oracle 分区表详解一、分区表的概述:Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。

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

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

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

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

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

1、分区表的优点:(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;(2)可以对单独的分区进行备份和恢复;(3)可以将分区映射到不同的物理磁盘上,来分散IO;(4)提高可管理性、可用性和性能。

2、什么时候用分区表(1) 单表过大,超过一定范围,建议以g计算表,均可考虑用分区(2)历史数据据需要剥离的(3)查询特征非常明显,比如是按整年、整月或者按某个范围!3、分区表的类型1、range分区,按范围2、list分区,列举分区3、hash分区,根据hash值进行的散列分区4、复合分区,9i开始,Oracle就包括了2种复合分区,RANGE-HASH和RANGE-LIST。

在11g,Oracle 一下就提供了4种复合分区:RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。

二、创建分区的举例1、range分区create table p_table(obj_id number(10),object_id number(10),object_name varchar2(128),owner varchar2(30),object_type varchar2(19),created date)partition by range (obj_id)(partition obj_id1 values less than (20000),partition obj_id2 values less than (40000),partition obj_id3 values less than (60000),partition obj_id4 values less than (80000),partition obj_id5 values less than (99999));2、list分区create table l_table(obj_id number(10),object_id number(10),object_name varchar2(128),owner varchar2(30),segment_type varchar2(19),created date)partition by LIST(segment_type)(partition l_type1 values ('LOBINDEX') tablespace my_space1, partition l_type2 values ('VIEW') tablespace my_space2, partition l_type3 values ('TABLE') tablespace my_space2);3、hash分区create table h_table(obj_id number(10),object_id number(10),object_name varchar2(128),owner varchar2(30),object_type varchar2(19),created date)partition by hash(object_id)( partition h_objid1,partition h_objid2,partition h_objid3,partition h_objid4);4、复合分区Oracle11g一下就提供了4种复合分区:RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。

oracle数据库表分区方法

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按日其定时创建分区实例1创建一张分区表,使用本地索引-- Create tablecreatetable TEST_DAY_INTERVAL_PARTITION(idNUMBERnotnull,time_col DATEnotnull)partitionbyrange (TIME_COL)(partition PDEFAULT valueslessthan (MAXVALUE)tablespace TS_TESTpctfree10initrans1maxtrans255storage(initial64Knext1Mminextents1maxextentsunlimited));-- Create/Recreate primary, unique and foreign key constraints altertable TEST_DAY_INTERVAL_PARTITIONaddconstraint PK_TEST_DAY_INTERVAL_PART primarykey (ID, TIME_COL) usingindexlocal;--创建本地分区索引2创建分区表存储过程CREATEORREPLACEPROCEDURE p_test_create_partition/* ver1.0 */(p_errno OUTNUMBER, --返回错误编号,0=成功,-1=失败p_errmsg OUTVARCHAR2--返回错误信息) ASPRAGMAAUTONOMOUS_TRANSACTION;v_exp_app EXCEPTION;v_id NUMBER;v_tablename VARCHAR2(64);v_create_start VARCHAR2(1024);v_create_date_start date;v_sqlstr VARCHAR2(1024);v_max_partitoin VARCHAR2(100);v_partition_name VARCHAR2(64);BEGINv_tablename := 'test_day_interval_partition';SELECT--获取目标表最大分区信息substr(MAX(partition_name), 2)INTO v_max_partitoinFROM user_tab_partitionsWHERE table_name = upper('test_day_interval_partition')AND partition_name<>'PDEFAULT';v_create_start := nvl(v_max_partitoin, to_char(trunc(SYSDATE - 1),'yyyymmdd'));v_create_date_start :=to_date(v_create_start,'yyyymmdd');FOR i IN1 ..10LOOPBEGINv_partition_name := 'P' || to_number(to_char(v_create_date_start + i, 'YYYYMMDD'));v_sqlstr := 'ALTER TABLE ' || v_tablename || ' SPLIT PARTITION PDEFAULT at (to_date('''||to_char(v_create_date_start + i + 1 , 'yyyymmdd') ||''',''yyyymmdd'') ) INTO ( PARTITION ' || v_partition_name || ', PARTITION PDEFAULT)';EXECUTEIMMEDIATE v_sqlstr;EXCEPTIONWHENOTHERSTHENROLLBACK;p_errmsg := '执行失败!' || SQLERRM || v_sqlstr;COMMIT;END;ENDLOOP;p_errmsg := '';p_errno := 0;EXCEPTIONWHENOTHERSTHENIFSQLCODEIN (-14623, -14313) THEN--如果是对象已存在,不处理异常,按成功返回p_errno := 0;ELSIFSQLCODE = -54THEN--解决并发DDL时的resource busy错误dbms_lock.sleep(dbms_random.value(0, 2));EXECUTEIMMEDIATE p_errmsg;p_errno := 0;ELSEp_errno := -1;p_errmsg := '表 ' || v_tablename || ' 创建分区P' || v_id || '分区失败!' || p_errmsg ||SQLERRM;ENDIF;END;3分区创建定时任务declarev_job_id number;beginFOR job_id_tab IN (SELECT job FROM user_jobs WHERE whatLIKE'%p_test_create_partition%') LOOPdbms_job.remove(job_id_tab.job);ENDLOOP;dbms_job.submit(v_job_id,'p_test_create_partition;',sysdate,'sysdate + 5');dbms_job.run(v_job_id);end;/。

oracle自动分区

oracle自动分区

1、创建表注意:创建的表必须有一个足够大的初始分区,因为后续增加分区都是在当前这个分区上面分裂而来的。

2、创建存储过程3、在oracle的命令行界面执行下面操作,启动一个job:说明:一些常用命令:--给指定表添加分区alter table TEST3 add partition part_aaa values lessthan(TO_DATE('01-JUL-2009','DD-MON-YYYY'))--分裂分区alter table TEST2 split partition ORD_ACT_PART02 AT (TO_DATE('01-JUL-2009','DD-MON-YYYY')) INTO (PARTITION P1,PARTITION ORD_ACT_PART02);--删除指定表的指定分区ALTER TABLE TEST3 DROP PARTITION part_aaa;--查看某张表所有分区信息SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TEST2'--查看指定分区记录SELECT * FROM TEST2 PARTITION (P1)--查看定时任务job相关信息SELECT job,broken,what,interval,t.* from user_jobs t;SELECT job,broken,what,interval,t.next_sec ,SYSDATE from user_jobs t; --对应broken为N的时候job才为运行状态SELECT * from dba_jobs order by job;--删除jobA、查找job对应的idSELECT job,broken,what,interval,t.next_sec ,SYSDATE from user_jobs t;B、根据查找到的job的id来删除指定的job--在删除分区表的时候,用下面的语句,否则分区表的信息会放到oracle的垃圾站中去,会导致存储过程中判断分区是否存在的时候会有问题DROP TABLE TEST2 PURGE--下面的语句是清空oracle的垃圾站数据PURGE recyclebin;。

oracle11ginterval(numtoyminterval())自动创建表分区

oracle11ginterval(numtoyminterval())自动创建表分区

oracle11ginterval(numtoyminterval())⾃动创建表分区Oracle11g通过间隔分区实现按⽉创建表分区
在项⽬设计过程中由于单表的数据量⾮常庞⼤,需要对表进⾏分区处理。

由于表中的数据是历史交易,故按⽉分区,提升查询和管理。

由于之前对于表分区了解不多,为了实现上述功能查了很多资料,⼀开始的⽅向是通过Crontab调⽤Shell脚本来按⽉⾃动创建分区,或者使⽤的Job调⽤存储过程来⾃动创建分区。

在研究上述两套⽅案的过程中,⽆意发现Oracle11g有间隔分区功能,对于使⽤Range分区的可以按年,⽉,⽇来⾃动⽣成分区。

语法如下:
1 2 3 4 5 6 7 8 9 10 11 12CREAT TABLE TABLE1
(
TABLE_ID NUMBER(8),
SUB_DATE DATE,
VALUE NUMBER(8)
)
PARTITION BY RANGE(SUB_DATE)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION P1 VALUES LESS THAN(TO_DATE('2014-05-01','YYYY-MM-DD')) );
2014年5⽉1⽇前的数据会放⼊p1分区,5⽉1⽇后的数据每⽉只要有数据,就会⾃动创建⼀个分区。

按时间分区自动建分区表

按时间分区自动建分区表

按时间分区⾃动建分区表在oracle11以前,分区维护需要⼿⼯维护,就是要⼿⼯建表分区。

oracle11以后,就可以⾃动建时间分区了。

1、查看oracle 的版本号select*from v$version;我的oracle是11,⽀持⾃动建分区,查询结果如下:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionPL/SQL Release 11.2.0.4.0 - ProductionCORE 11.2.0.4.0 ProductionTNS for Linux: Version 11.2.0.4.0 - ProductionNLSRTL Version 11.2.0.4.0 - Production2、⽤分区建表(1)partition by range (CREATE_DATE) interval (numtoyMinterval (1,'MONTH'))根据CREATE_DATE⾃动按⽉建分区create table T_ZNF(ID NUMBER(24) not null,CREATE_DATE DATE,STATE VARCHAR2(10),T_DESC VARCHAR2(255)) tablespace TBS_APP_LOG --指定表空间(如果在下⾯的建分区时,指定表空间,后⾯⾃动建的分区表空间还是系统给的)partition by range (CREATE_DATE) interval (numtoyMinterval (1,'MONTH'))(partition T_LOGTIME_main values less than (TO_DATE(' 2018-02-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) );插⼊数据⾃动在指标的表空间下建⽴了分区表按⽇⾃动建分区1create table MEAP_LOG2 (3 LOGID VARCHAR2(32) not null,4 LOGINNAME VARCHAR2(32),5 AREA VARCHAR2(32),6 LOGTYPE VARCHAR2(32) not null,7 MESSAGE VARCHAR2(4000),8 DETAIL CLOB,9 LOGTIME DATE not null10 )tablespace TBS_APP_LOG11 partition by range (LOGTIME) INTERVAL(NUMTODSINTERVAL(1,'DAY'))12 (13 partition T_LOGTIME_main values less than (TO_DATE(' 2018-2-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 1415 );(2)-- Create tablecreate table T_ZNF(ID NUMBER(24) not null,CREATE_DATE DATE,STATE VARCHAR2(10),T_DESC VARCHAR2(255))partition by range (CREATE_DATE)(partition T_ZNF_201702 values less than (TO_DATE(' 2017-02-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace TBS_ISAP);-- Create/Recreate primary, unique and foreign key constraintsalter table T_ZNFadd constraint PK_T_ZNF_ID primary key (ID)using indextablespace TBS_ISAP;-- Create/Recreate indexescreate index IDX_T_ZNF_CREATE_DATE on T_ZNF (CREATE_DATE)tablespace TBS_ISAP;时间函数numtodsinterval和numtoyminterval:两个函数都是时间的增加函数,只是增减的对象不⼀样(减是在数字前加符号‘-’)。

Oracle11g分区表创建(自动按年、月、日分区)

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添加分区表

ORACLE添加分区表-- Create tablecreate table T_REPORT_DAILYSALES(ORDERDATE DATE not null,BRANCHFLAG CHAR(3) not null,PRODID CHAR(11) not null,QUANTITY NUMBER(15,2),AMOUNT NUMBER(15,2))partition by range (ORDERDATE)(partition Daysales2009_01 values less than (TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_02 values less than (TO_DATE(' 2009-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_03 values less than (TO_DATE(' 2009-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_04 values less than (TO_DATE(' 2009-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_05 values less than (TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_06 values less than (TO_DATE(' 2009-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_07 values less than (TO_DATE(' 2009-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_08 values less than (TO_DATE(' 2009-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_09 values less than (TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_10 values less than (TO_DATE(' 2009-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_11 values less than (TO_DATE(' 2009-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited),partition Daysales2009_12 values less than (TO_DATE(' 2009-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))tablespace RPTFACT2009pctfree 10initrans 1maxtrans 255storage(initial 10Mminextents 1maxextents unlimited));comment on table T_REPORT_DAILYSALESis '商品⽇均销量(31天)';-- Add comments to the columnscomment on column T_REPORT_DAILYSALES.ORDERDATEis '⽇期';comment on column T_REPORT_DAILYSALES.BRANCHFLAGis '分公司标识';comment on column T_REPORT_DAILYSALES.PRODIDis '商品内码';comment on column T_REPORT_DAILYSALES.QUANTITYis '数量';comment on column T_REPORT_DAILYSALES.AMOUNTis '⾦额';-- Create/Recreate indexesalter table T_REPORT_DAILYSALESadd primary key (ORDERDATE, BRANCHFLAG, PRODID)using indextablespace RPTINDEXpctfree 10initrans 2maxtrans 255storage(initial 5Mminextents 1maxextents unlimited);。

RANGE分区表增加分区

RANGE分区表增加分区
Байду номын сангаас
TABLE_NAME PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- -------------------- ---------- ---------------
T_PARTITION_RANGE T_RANGE_P1 10 TBS_PART01
T_PARTITION_RANGE T_RANGE_P2 20 TBS_PART02
T_PARTITION_RANGE T_RANGE_P3 30 TBS_PART03
T_PARTITION_RANGE T_RANGE_P4 40 TBS_PART04
TABLE_NAME PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- -------------------- ---------- ----------------
T_PARTITION_RANGE T_RANGE_P1 10 TBS_PART01
sec@ora10g> select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name='T_PARTITION_RANGE' order by partition_position;
8.展示使用split完成上面没有完成的分区任务
sec@ora10g> alter table t_partition_range split partition t_range_pmax at (40) into (partition tbs_part05, partition t_range_pmax);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-- 输入参数: para_table_name 分区表的名称
-- 输出参数: ret_code 0 :执行成功 1:分区名已经存在 2:其他原因导致失败
-- 输入资源:
-- 输出资源:
-- 中间资源:
-- 创建人员: ls
-- 创建日期: 2012-02-21
--dbms_output.put_line(l_sql);
--/*
if is_exists = 0 then
begin
execute immediate l_sql;
ret_code := 0;
excname := 'p' || to_char(sysdate + 1, 'yyyymmdd');
----查询分区类型
l_sql_range := 'alter table t_location add partition ' ||
l_part_name || ' values less than (to_date(' || chr(39) ||
l_part_cond varchar2(200); --时间条件
l_part_name varchar2(20); ---系统生成的分区名称
l_sql varchar2(2000); ---需要执行的sql
l_sql_range varchar2(2000); ---range分区是拼装的语句
create or replace procedure p_auto_add_part is
-- ********************************************************************************
-- 程序名称:
-- 功能描述: 可以做成job在每日凌晨启动,建立下一天的分区
l_part_cond || chr(39) || ',' || chr(39) || 'yyyy-mm-dd' ||
chr(39) || '))';
l_sql := l_sql_range;
---判断生成的分区名在表上是否已经存在
ret_code := 1;
end;
end if;
--*/
end;
select count(partition_name)
into is_exists
from user_tab_partitions
where table_name = upper('t_location')
and partition_name = l_part_name;
is_exists number; ---判断该分区名是否已经存在
l_part_type varchar2(20); ---分区类型
ret_code number:=2;
begin
ret_code := 2;
----生成所需要的元素值
l_part_cond := to_char(sysdate + 2, 'yyyy-mm-dd');
-- 版本说明: v1.0
-- 修改人员:
-- 修改日期:
-- 修改原因:
-- 版本说明:
-- 公司名称:
-- ********************************************************************************
相关文档
最新文档