oracle按时间创建分区表

作者&投稿:束向 (若有异议请与网页底部的电邮联系)
~ 首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO。oracle分区表是oracle数据库提供的一种表分区的实现形式。表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表
一、分区表基本操作
1、按时间分区表创建:
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数据
declare i int := 1; yearVARCHAR2(20);begin loop year := CASEmod(i, 3) WHEN 0 THEN ‘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;
查看分区表的分区的详细信息
Select table_name,partition_name,high_value fromdba_tab_partitions where table_name=‘T_TEST‘;2、分区表修改
2.1增加一个分区
分两种情况:1.没有maxvalue分区。2.有maxvalue分区。我们创建的分区就是没有maxValue的分区
1.没有maxvalue分区添加新分区:
alter table t_test add partition t_test_2015 VALUESLESS THAN (TO_DATE(‘2015-01-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)) TABLESPACETS_MISPS ;
2、有maxvalue分区添加新分区:
有了maxvalue,就不能直接add partition,而是需要max分区split。例如我们将创建的分区的语句修改下:
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, PARTITIONt_test_2014 VALUES LESS THAN (TO_DATE(‘2015-01-01 00:00:00‘,‘yyyy-mm-ddhh24:mi:ss‘)) TABLESPACE TS_MISPS, PARTITION t_test_maxVALUES LESS THAN (MAXVALUE))
增加一个2016年的分区语句为:
alter table t_test split partition t_test_max at(TO_DATE(‘2016-01-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘)) into (partitiont_test_2015,partition t_test_max);2.2删除一个分区
alter table t_test drop partition t_test_2014
注:droppartition时,该分区内存储的数据也将同时删除,你的本意是希望删除掉指定的分区但保留数据,你应该使用merge partition,执行该语句会导致glocal索引的失效需要重建全局索引
2.3合并分区
相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。
Alter table t_test merge partitions t_test_2013 ,t_Test_2014 into partition t_Test_2013_to_2014
二、对分区表进行查询
2.1查询
不使用分区查询:默认查询所有分区数据
select * from t_test
使用分区查询:只查询该分区数据
select * from t_testpartition(t_test_2014) where add_date_time >=TO_DATE(‘2014-01-01 00:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);2.1插入
insert into t_test values(i, to_date(year,‘yyyy-mm-dd hh24:mi:ss‘));2.1删除
使用分区删除
更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会删除数据
delete t_test partition(t_test_2013) where id=1;
不使用分区删除
delete t_test whereid=1;2.1修改
使用分区更新
更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会更新数据
delete t_test where id=1;update t_test partition(t_test) set id=1 where id=2;
不使用分区
delete t_test where id=1;update t_test set id=1 where id=2;三、普通表和分区表互转
普通表—>分区表
1、新建一个字段一样的中间的分区表(T_NEW)
2、将T数据导入到T_NEW中
INSERT INTO T SELECT field1,filed2, …from T
将老表重命名
RENAME T TO T_OLD;
将新表重命名
RENAME T_NEW TO T;
这种适合静态操作,不保证数据一致性。如果在生产环境切换,利用利用在线重定义功能。
oracle按时间创建分区表


Oracle 创建一个触发器,生成类似 “USER201309140001”格式,后面四位每...
你好:你的这个数据是有规律的。你的user 与后面的0001,9999是不变的,中间的是一个时期,这样的话你的触发器就可以设计为依靠截取时间进行拼串获取了 索要用到的函数就是to_date与to_char ,substr 你先获取到sysdate,然后to_char(sysdate,'yyyy-mm-dd');之后你可以获取到当前的天,年,月,...

请教一下oracle中如何筛选记录创建时间与今天系统时间之差超过180天...
select * from table_name where to_date(cjsj, 'dd-mm-yyyy') < sysdate - 180

oracle分区表的分区有几种类型
oracle分区表的分区有四种类型:范围分区、散列分区、列表分区和复合分区。特点如下:1、范围分区 就是根据数据库表中某一字段的值的范围来划分分区。数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。2、散列分区 根据字段的hash值进行均匀分布,尽可能地实现各分区所散列的数据相等。散列分区即...

什么叫Oracle的规范化的概念
属于ORACLE的关键字大小,表名、列名等小写。2查询 在表查询中,一律不要使用* 作为查询的字段列表,需要哪些字段必须显式写明 在表查询中,必须有Where条件,除非此表为非增长表 在表查询中,一次最多返回的记录条数不要超过1000条或记录内容不要大于1MB的数据。在表查询中,作Order By排序时,优先...

oracle 如果在创建表时时间默认为当前系统时间,那么怎么在修改时默认为...
oracle 如果在创建表时时间默认为当前系统时间,那么怎么在修改时默认为修改时的当前系统时间?DML触发器,有update操作时修改为当前系统时间

oracle 如何实现定时插入
前提是 表1和表2 的数据结构完全一致。另外 可以创建一个新表来实现 create table 表1 as (你要插入的数据)如 select * from 表2 此时可以创建一个新表出来。2。实现定时插入数据 答:请查看这篇文章 http:\/\/www.ofadmin.com\/Oracle\/kaifa\/200901\/19-5079_2.html 参考资料:http:\/\/www...

oracle partition table 表分析 怎么解决
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 VALU...

oracle每隔一小时执行一次定时任务,批量执行语句
create table a(a date);create or replace procedure test as begin insert into a values(sysdate);end;

oracle中根据时间查询三个月前订单的sql语句
1.打开PLSQL,连接到oracle数据库,并使用SQL语句创建一个测试表。2. 使用SQL语句将3行测试数据插入到前面步骤中创建的测试表中,并使用系统的当前时间插入date字段。3.执行SQL后,记得点击submit按钮,将100个提交的更改保存到数据库中,否则,数据将不会存储在数据库中。4.提交后,查询刚刚插入的...

oracle中创建表时Datetime默认系统时间怎么做
oracle中没有datetime类型的字段,只有date类型,可以参考以下语句:create table test(id int,time date default sysdate);其中default sysdate就是代表默认的系统时间,验证方法如下:insert into test (id) values (1);commit;结果截图:插入的时间与系统时间是一致的,说明设置默认时间是成功的。

灌南县18654721971: oracle中怎么对某个时间段内创建分区 -
自程威利: 1、一般分区表都会很大,所以可以先创建表空间,为了让分区表存放到单独的表空间,否则默认会存放到USERS表空间2、创建TABLESPACE TS1:CREATE TABLESPACE TS1 DATAFILE '/data1/oracle/test.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED;

灌南县18654721971: oracle按时间分区如何进行? -
自程威利: create table () partition by range(date_time)(partition date_time_2012_9 values less than(to_date('20121001','yyyymmdd')) tablespace ts_date_time_2012_9,...............);

灌南县18654721971: oracle怎么按周或星期创建表分区 -
自程威利: 这里给你一个例子,可以参考着这个写:create table test (id number, time date) partition by range (time)( partition p201609 values less than (to_date('2016-10-1', 'yyyy-mm-dd')),partition p201610 values less than (to_date('2016-11-1', 'yyyy-mm-dd')...

灌南县18654721971: oracle数据库是怎样实现按月分区的?求详细解答 -
自程威利: 代码简单就是你复制的那样 具体的实现方式就是 在你ORD_ACT_PART01 分区中,要存放日期小于2003年5月1号的数据,也就是存放2003年4月的,以及以前的所有 ORD_ACT_PART02 分区中存放2003年5月的数据,但是因为之前有了2003...

灌南县18654721971: oracle 大表时间分区 -
自程威利: 要看应用的运行环境,如果是在线运营的生产系统,最好一个月建一次,每次40天左右.这么做出于几点考虑:1.oracle修改分区时会造成使用这张表的存储过程暂时失效,虽然Oracle会自动在存储过程失效后第一次执行时recompile,但毕竟要耗时间,如果对时间性能要求非常高、且并发频繁的环境,很容易出事2.不要使用子分区,原因:维护过于麻烦.因为客户维护人员的技术水平不是你能掌握的3.40天的设定主要是留有一个缓冲区,防止在应维护那天临时有事无法维护.留10天的缓冲,应能保证及时维护.4.不建议设定为3个月或1年,那样空间浪费太大.

灌南县18654721971: oracle建表按日分区,如何truncate当前日期15天前的记录分区
自程威利: declarev_sql varchar2(2000);beginv_sql:='alter table tablename truncate partition PAR_LOG_'||(select to_number(to_char(sysdate-15,'dd')) num from dual);execute immediate v_sql;end;

灌南县18654721971: oracle 大表,创建分区表如何按月分区 求详细sql -
自程威利: create table xxx(id number,time date) parttion by range(time)(partion part1 values less than (to_date('2012-01-31','yyyy-mm-dd')) tablespace tb1,partion part 2 vales less than(to_date('2012-01-31','yyyy-mm-dd')) tablespace tb2);

灌南县18654721971: oracle具体怎么分区 -
自程威利: 你说的是oracle分区表吧,一般数据量大的表格采用到此功能,一个表上千万数据以上.以下例子,分区创建需要有条件,如时间,语法可详见metalink CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')), PARTITION P2 VALUES LESS THAN (MAXVALUE));

灌南县18654721971: Oracle 11G的间隔分区怎么创建 求语法 -
自程威利: 间隔分区只适用于range类型的分区.CREATE TABLE interval_sales( prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id NUMBER(6), quantity_sold NUMBER(3), amount_sold NUMBER(10,2)) PARTITION BY ...

灌南县18654721971: oracle怎样创建分区表 -
自程威利: 给一个例子:create table T_S_SYS_LOG( LOG_MONTH VARCHAR2(6), ) partition by list (LOG_MONTH)( partition PRT_M_201309 values ('201309') tablespace TBS_LBI_SYS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网