`

Oracle JOB实现多线程插入

 
阅读更多
--参考之TOM 编程艺术中的DIY并行

--经测试,大数据量的插入,多线程在普通磁盘执行效率反而更慢,不如单insert语句,而在磁盘阵列硬件环境下执行效率有很大的提升。



--创建表,模拟多线程插入(TT3->TT4)
DROP TABLE TT3;
DROP TABLE TT4;
CREATE TABLE TT4 AS SELECT * FROM DBA_OBJECTS WHERE 1=0;
CREATE TABLE TT3 AS SELECT * FROM DBA_OBJECTS;
--数据分批插入参数表
DROP TABLE JOB_PARMS;
CREATE TABLE JOB_PARMS
 ( 
 JOB NUMBER PRIMARY KEY,
 LO_RID INT,
 HI_RID INT
 );
--创建插入的存储过程
CREATE OR REPLACE PROCEDURE PROC_TEST(P_JOB IN NUMBER) IS
 L_REC JOB_PARMS%ROWTYPE;
 BEGIN
 SELECT * INTO L_REC
 FROM JOB_PARMS
 WHERE JOB = P_JOB;
 INSERT INTO TT4
 SELECT A.OWNER,
       A.OBJECT_NAME,
       A.SUBOBJECT_NAME,
       A.OBJECT_ID,
       A.DATA_OBJECT_ID,
       A.OBJECT_TYPE,
       A.CREATED,
       A.LAST_DDL_TIME,
       A.TIMESTAMP,
       A.STATUS,
       A.TEMPORARY,
       A.GENERATED,
       A.SECONDARY
  FROM (SELECT ROWNUM RN, TT3.* FROM TT3 WHERE ROWNUM <= L_REC.HI_RID) A
 WHERE A.RN >= L_REC.LO_RID;
  DELETE FROM JOB_PARMS WHERE JOB = P_JOB;
   COMMIT;
   END;
/
---DIY 并行调度程序块
DECLARE
L_JOB NUMBER;
C_INDEX NUMBER;--插入的数量总数
S_INDEX INT:=0;--插入的开始index
E_INDEX INT:=0;--插入的结束index
CQ_INDEX INT:=20;--循环的次数
NUM_INCREASE INT:=0;--增量累加
V_I INT:=0;--计数器
BEGIN
SELECT COUNT(*) INTO C_INDEX FROM TT3;
NUM_INCREASE:= CEIL(C_INDEX/CQ_INDEX);
WHILE CQ_INDEX > V_I
LOOP
V_I:=V_I+1;
S_INDEX:=1+NUM_INCREASE*(V_I-1);
IF(V_I = 20) THEN--当等于循环次数则修改结束的index
E_INDEX:= C_INDEX;
ELSE 
E_INDEX:=NUM_INCREASE*V_I;
END IF;
DBMS_JOB.SUBMIT( L_JOB, 'PROC_TEST(JOB);');
INSERT INTO JOB_PARMS(JOB, LO_RID, HI_RID)
VALUES ( L_JOB, S_INDEX, E_INDEX );
END LOOP;
END;
/
--输入COMMIT开始执行
COMMIT;

--查看job是否执行完成

SELECT * FROM DBA_JOBS_RUNNING;

 

0
1
分享到:
评论

相关推荐

    oracle基础知识,李兴华.pdf

    - **Oracle8**:是Oracle公司推出的第八代产品,支持多线程服务器(MTS)架构,提升了数据库的性能。 - **Oracle8i**:在Oracle8的基础上加入了对Internet的支持,"i"代表Internet。 - **Oracle9i**:进一步增强了...

    oracle数据库经典题目

    在Oracle数据库中,数据库的操作模式分为专用服务器(DELICATED SERVER)模式和多线程服务器(MULTITHREADED SERVER)模式两种。其中,在专用服务器模式中为每个用户进程创建一个服务器进程,用户进程与服务器进程之间...

    并发执行存储过程.pdf

    这个过程会从JOB_PARMS表中获取指定job的rowid范围,然后遍历BIG_TABLE中对应范围的行,执行复杂的过程并将结果插入到T2表中。存储过程最后会删除已完成的job记录并提交事务。 为了调度任务,我们需要一个查询来...

    三三得玖公司java笔试题

    Java中实现多线程的方式有多种: - **继承Thread类**:创建一个新类继承自`Thread`类,并重写`run`方法。 - **实现Runnable接口**:定义一个实现`Runnable`接口的类,并实现`run`方法,然后通过`Thread`类实例来执行...

    TestJob

    1. **Java编程**:TestJob的核心是Java代码,开发者需要熟悉Java语言,包括类、对象、接口、异常处理、多线程等基础知识。可能还需要使用Java JDBC(Java Database Connectivity)来连接和操作数据库。 2. **数据库...

    toad使用技巧说明

    5. **多线程支持**:若需实现类似PL/SQL Developer的多线程操作,可以在安装时选择相关选项,或者在已安装后进入`View -&gt; Options -&gt; Oracle Transactions`,启用第一个选项,允许取消当前操作。 6. **直接编辑查询...

    kettle DM动态脱敏水壶数据转化

    #### 3.2 多线程 如果数据量庞大,可以考虑使用Kettle的并行处理功能,如设置并行执行的步骤或工作流,以提高数据处理效率。 在实际操作中,除了上述步骤外,可能还需要进行性能调优、错误处理和数据验证等操作。...

    松迪培训入学测试题

    多线程环境下则推荐使用`StringBuffer`。 2. **代码示例**: ```java String[] strings = new String[30000]; // 假设数组已初始化 StringBuilder sb = new StringBuilder(); for (String s : strings) { sb....

Global site tag (gtag.js) - Google Analytics