对上一篇文章进行实际的运用。在工作中遇到有一张大表(五千万条数据),在开始的时候忘记了创建自动分区,导致现在使用非常不方便,查询的速度非常的满,所以就准备重新的分区表,最原始方法是先创建新的分区表,然后将数据依次插入到新的表中,但是我们的表的数据比较的大,如果这样做可能导致效率相对较低,经过寻扎发现了上一篇文章,这篇文章有三个方法,第一个就是最原始的方法,我没有进行实验,第二种(交换分区)和第三种的(在线重定义)我都进行了测试,第三种方法,我初以为会比较快速,但是经过测试需要超过2个小时的时间,不是很理想,于是使用了第二种方法(交换分区)!大概是20分钟,还是比较理想的。

以下是实践中的SQL:

--准备新的分区表
--做的是安月进行分区
CREATE TABLE FACT_BOND_PROFIT_NEW (
D_DATE DATE,
VC_CURVE_NAME VARCHAR2(100),
VC_CURVE_CODE VARCHAR2(10),
VC_CURVE_CLASSIFY VARCHAR2(20),
F_CURVE_FUTURE NUMBER(19,4),
F_STANDARD_TERM NUMBER(19,4),
VC_STANDARD_TERM_DESC VARCHAR2(20),
F_PROFITRATIO NUMBER(19,4),
VC_SOURCE VARCHAR2(20),
D_UPDATETIME DATE
)
PARTITION BY RANGE (D_DATE)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2013-1-1', 'YYYY-MM-DD'))
); -- Add comments to the table
comment on table FACT_BOND_PROFIT_NEW
is '债券收益率曲线';
-- Add comments to the columns
comment on column FACT_BOND_PROFIT_NEW.d_date
is '业务日期';
comment on column FACT_BOND_PROFIT_NEW.vc_curve_name
is '曲线名称';
comment on column FACT_BOND_PROFIT_NEW.vc_curve_code
is '曲线代码';
comment on column FACT_BOND_PROFIT_NEW.vc_curve_classify
is '曲线分类,数据字典:CURVE_CLASSIFY';
comment on column FACT_BOND_PROFIT_NEW.f_curve_future
is '远期期限';
comment on column FACT_BOND_PROFIT_NEW.f_standard_term
is '标准期限';
comment on column FACT_BOND_PROFIT_NEW.vc_standard_term_desc
is '标准期限描述';
comment on column FACT_BOND_PROFIT_NEW.f_profitratio
is '收益率';
comment on column FACT_BOND_PROFIT_NEW.vc_source
is '数据源';
comment on column FACT_BOND_PROFIT_NEW.d_updatetime
is '更新时间';
-- Create/Recreate indexes
create index IDX_FACT_BOND_PROFIT_NEW1 on FACT_BOND_PROFIT_NEW (D_DATE, VC_CURVE_CODE, VC_SOURCE)
tablespace TPA_DW_INDEX;
-- Grant/Revoke object privileges
GRANT SELECT ON FACT_BOND_PROFIT_NEW TO TPA_QUERY; --创建分区信息的临时表
CREATE TABLE TMP_DBA_TAB_PARTITIONS
(
TABLE_NAME VARCHAR2(30),
PARTITION_NAME VARCHAR2(30),
HIGH_VALUE CLOB
); --FACT_BOND_PROFIT的各月数据表
CREATE TABLE FACT_BOND_PROFIT1 (D_DATE DATE); --过程运行时间信息
CREATE TABLE TMP_SYSDIME
(
TIME1 VARCHAR2(30),
TIME2 DATE
); -- Created on 2017/4/11 by ZW_HUANGZHIYA
declare
-- Local variables here
PARTITION_NAME VARCHAR2(30); --分区名称
MIN_DATE DATE; --原表中的最小日期
MAX_DATE DATE; --原表中的最大日期
V_DATE DATE;
V_DATE1 VARCHAR2(20);
LS_SQL VARCHAR2(2000);
begin
-- Test statements her
SELECT MIN(D_DATE),MAX(D_DATE)
INTO MIN_DATE,MAX_DATE
FROM FACT_BOND_PROFIT; V_DATE := MIN_DATE; --在新表中生成分区,方便交换
WHILE V_DATE <= MAX_DATE LOOP
INSERT INTO FACT_BOND_PROFIT_NEW (D_DATE)
SELECT V_DATE FROM DUAL;
COMMIT;
V_DATE := V_DATE + 1;
END LOOP; --清空刚刚插入的数据
EXECUTE IMMEDIATE 'TRUNCATE TABLE FACT_BOND_PROFIT_NEW';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TMP_DBA_TAB_PARTITIONS'; --将分区信息的数据插入临时表
INSERT INTO TMP_DBA_TAB_PARTITIONS
SELECT A.TABLE_NAME, A.PARTITION_NAME, TO_LOB(A.HIGH_VALUE) HIGH_VALUE
FROM DBA_TAB_PARTITIONS A
WHERE A.TABLE_NAME = 'FACT_BOND_PROFIT_NEW'
AND A.TABLE_OWNER = 'TPA_DW';
COMMIT; --循环对各个分区进行交换
FOR AA IN (SELECT * FROM TMP_DBA_TAB_PARTITIONS) LOOP --获取各个月对应的分区名称
SELECT TO_CHAR(SUBSTR(AA.HIGH_VALUE,11,10)),AA.PARTITION_NAME
INTO V_DATE1,PARTITION_NAME
FROM DUAL; --创建对应符合分区的数据表,其实进行了交换分区,表中就没有了数据,清空表是习惯
EXECUTE IMMEDIATE 'TRUNCATE TABLE FACT_BOND_PROFIT1';
EXECUTE IMMEDIATE 'DROP TABLE FACT_BOND_PROFIT1 PURGE'; --创建各月信息表,一般创表的速度要高于向表中插入的速度
LS_SQL := 'CREATE TABLE FACT_BOND_PROFIT1 NOLOGGING AS
SELECT * FROM FACT_BOND_PROFIT WHERE D_DATE BETWEEN ADD_MONTHS(TO_DATE('''||V_DATE1||''',''YYYY-MM-DD''),-1) AND TO_DATE('''||V_DATE1||''',''YYYY-MM-DD'') - 1';
EXECUTE IMMEDIATE LS_SQL; --进行交换分区
EXECUTE IMMEDIATE 'ALTER TABLE FACT_BOND_PROFIT_NEW EXCHANGE PARTITION '||PARTITION_NAME||' WITH TABLE FACT_BOND_PROFIT1'; --生成日志
INSERT INTO TMP_SYSDIME
SELECT V_DATE1,SYSDATE FROM DUAL;
COMMIT;
END LOOP; EXECUTE IMMEDIATE 'DROP TABLE TMP_DBA_TAB_PARTITIONS';
EXECUTE IMMEDIATE 'DROP TABLE FACT_BOND_PROFIT1'; exception when others then
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end; --日志
--DROP TABLE TMP_SYSDIME;
--SELECT * FROM TMP_SYSDIME;
--FACT_BOND_PROFIT对应的新表
--SELECT * FROM FACT_BOND_PROFIT_NEW;

Oracle中的Long类型的数据是不能进行like操作的,我们可以将long类型的数据,先转换为clob类型,然后再进行like的操作。

为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G的更多相关文章

  1. 修改SQL Server数据库表的创建时间最简单最直接有效的方法

    说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,因为这种操作方式是通用的,即使是对现在最新的SQL Server数据库里面的操作也是一 ...

  2. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  3. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  4. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  5. Entity Framework表名默认自动变为复数形式等常见问题解决方法

    今天使用了一下手写EntityFramework,发现一些常见的问题,做个记录: 1.以前使用模板生成不太在意的问题,就是在定义实体类时,如果没映射注释,自动映射的表名会变成复数形式 如:表名==&g ...

  6. oracle 11g 分区表创建(自动按年、月、日分区)

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...

  7. [转载]mysql创建临时表,将查询结果插入已有表中

    今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询 ...

  8. mysql创建临时表,将查询结果插入已有的表

    A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      nam ...

  9. Ubuntu 16.04创建Swap分区或增加Swap分区容量(转)

    要在Ubuntu中要创建Swap分区主要有如下2种方式: 一.传统创建方式 一般情况下,我们都会使用dd命令来预先创建交换分区文件,然后再用/dev/zero将该文件的内容全部置零,创建时还将用到bs ...

随机推荐

  1. MySQL调优三步曲(慢查询、explain profile)

    在做性能测试中经常会遇到一些sql的问题,其实做性能测试这几年遇到问题最多还是数据库这块,要么就是IO高要么就是cpu高,所以对数据的优化在性能测试过程中占据着很重要的地方,下面我就介绍一些msyql ...

  2. php回滚

    $m=D('YourModel');//或者是M();$m2=D('YouModel2');$m->startTrans();//在第一个模型里启用就可以了,或者第二个也行$result=$m- ...

  3. Swift应用案例 1.无限轮播

      从今天开始,我学习的重点开始转向Swift,并且会分享一些自己学习的心得体会,今天给大家带来的的是无限轮播.广告页的无限轮播是非常常见的一个功能,大多数APP都有,大多数程序员也都实现过,今天我们 ...

  4. JS入门(五)

    前面提了很多JS的基础知识,像一些基本输出语句啊,JS中的关键字呐.然后是JS中的一些循环,数组之类的,在之后就是函数了.这些都是在JS中很基础的一些东西,在我刚开始学JS的时候,这些我就觉得很简单, ...

  5. wemall开源商城免费商城系统部分代码(内含代码地址)

    wemall开源商城免费商城系统部分代码,下面分享部分代码,供学习者学习: 开源版把install文件夹下的install.lock删除之后可进行自动安装 后台访问地址:http:// www.xxx ...

  6. 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐

    1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 432  Solved: 270[ ...

  7. Java synchronized 关键字的实现原理

    数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现sy ...

  8. java-信息安全(五)-非对称加密算法RSA

    概述 信息安全基本概念: RSA算法(Ron Rivest.Adi Shamir.Leonard Adleman,人名组合) RSA RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rive ...

  9. 四大组件之一---------activity的知识

    activity的生命活动 activity的四种启动模式 Android中以一个任务栈用来管理activity 一个栈的形式进行管理 在清单文件中,通过<activity>标签的andr ...

  10. JavaEE开发基于Eclipse的环境搭建以及Maven Web App的创建

    本篇博客就完整的来聊一下如何在Eclipse中创建的Maven Project.本篇博客是JavaEE开发的开篇,也是基础.本篇博客的内容干货还是比较多的,而且比较实用,并且都是采用目前最新版本的工具 ...