在Oracle中处理脚本中的多次插入

在Oracle中处理脚本中的多次插入,oracle,plsql,Oracle,Plsql,我必须写一个多插入的脚本。我也这么做了,并用蟾蜍来写剧本。剧本大约在35-40分钟内完成 然后,我将该脚本应用于autosys,并再次运行它(这就是应该如何使用它)。这一次,它持续运行了1.5个多小时 我必须手动终止Oracle中的活动会话 请看我的脚本,让我知道,为什么它没有在预定的40分钟时间内完成,并持续运行超过1.5小时 编辑:我想提及的是,在Autosys调用的父脚本中调用了诸如“commit”之类的常见命令。 我的脚本是在父脚本中调用的子脚本之一 -- Begining of Con

我必须写一个多插入的脚本。我也这么做了,并用蟾蜍来写剧本。剧本大约在35-40分钟内完成

然后,我将该脚本应用于autosys,并再次运行它(这就是应该如何使用它)。这一次,它持续运行了1.5个多小时

我必须手动终止Oracle中的活动会话

请看我的脚本,让我知道,为什么它没有在预定的40分钟时间内完成,并持续运行超过1.5小时

编辑:我想提及的是,在Autosys调用的父脚本中调用了诸如“commit”之类的常见命令。 我的脚本是在父脚本中调用的子脚本之一

-- Begining of Consolidated queries for Slow performing Talend Jobs 
SET SERVEROUTPUT ON;
spool Consolidated.log;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SET DEFINE OFF;

ALTER SESSION SET GLOBAL_NAMES=FALSE;

DECLARE
ExtractType         NUMBER(9);
RecordsExtracted    NUMBER(9);
CurStatus           NUMBER(9);
StartDate           date;
ErrorMessage        NVARCHAR2(1000);
LastExtrctTimestamp DATE;


-- TABLE1 
BEGIN
    StartDate := sysdate;
    ExtractType := 44;

    DELETE FROM Table1;

    INSERT INTO Table1
    SELECT  Statement....;
    RecordsExtracted := SQL%RowCount;

    DBMS_OUTPUT.put_line('Table1 Records Extracted:' || RecordsExtracted);       

    -- On Success
    CurStatus := 2;
    ErrorMessage := 'Table1 Complete';

    INSERT INTO ExtractRecords(ExtractType, RecordsExtracted, Status, ExtractTimestamp, StartDate, EndDate, ErrorMessage)
    VALUES (ExtractType, RecordsExtracted, CurStatus, SysDate, StartDate, SysDate, ErrorMessage);

    INSERT INTO LoadRecords (LoadType,Status,LoadTimestamp,StartDate,EndDate) 
    VALUES (ExtractType, CurStatus, SysDate, StartDate, SysDate);

-- TABLE2 RESULTS 

    StartDate := sysdate;
    ExtractType := 78;

    DELETE FROM Table2;

    INSERT INTO Table2
    SELECT  Statement....;
    RecordsExtracted := SQL%RowCount;       

    DBMS_OUTPUT.put_line('Table2 Records Extracted:' || RecordsExtracted);

    -- On Success
    CurStatus := 2;
    ErrorMessage := 'Table2 Complete';

    INSERT INTO ExtractRecords(ExtractType, RecordsExtracted, Status, ExtractTimestamp, StartDate, EndDate, ErrorMessage)
    VALUES (ExtractType, RecordsExtracted, CurStatus, SysDate, StartDate, SysDate, ErrorMessage);

    INSERT INTO LoadRecords (LoadType,Status,LoadTimestamp,StartDate,EndDate) 
    VALUES (ExtractType, CurStatus, SysDate, StartDate, SysDate);

-- TABLE3 

    StartDate := sysdate;
    ExtractType := 81;

    DELETE FROM Table3;

    INSERT INTO Table3
        SELECT  Statement....;
        RecordsExtracted := SQL%RowCount;       

    DBMS_OUTPUT.put_line('Table3 Records Extracted:' || RecordsExtracted);

    -- On Success
    CurStatus := 2;
    ErrorMessage := 'Table3 Complete';

    INSERT INTO ExtractRecords(ExtractType, RecordsExtracted, Status, ExtractTimestamp, StartDate, EndDate, ErrorMessage)
    VALUES (ExtractType, RecordsExtracted, CurStatus, SysDate, StartDate, SysDate, ErrorMessage);

    INSERT INTO LoadRecords (LoadType,Status,LoadTimestamp,StartDate,EndDate) 
    VALUES (ExtractType, CurStatus, SysDate, StartDate, SysDate);


-- TABLE4 

    StartDate := sysdate;
    ExtractType := 57;

    DELETE FROM Table4;

    INSERT INTO Table4
        SELECT  Statement....;
        RecordsExtracted := SQL%RowCount;       

    DBMS_OUTPUT.put_line('Table4 Records Extracted:' || RecordsExtracted);

    -- On Success
    CurStatus := 2;
    ErrorMessage := 'Table4 Complete';

    INSERT INTO ExtractRecords(ExtractType, RecordsExtracted, Status, ExtractTimestamp, StartDate, EndDate, ErrorMessage)
    VALUES (ExtractType, RecordsExtracted, CurStatus, SysDate, StartDate, SysDate, ErrorMessage);

    INSERT INTO LoadRecords (LoadType,Status,LoadTimestamp,StartDate,EndDate) 
    VALUES (ExtractType, CurStatus, SysDate, StartDate, SysDate);
END;

spool off;
exit;
/

脚本中没有提交。可能是在第一个会话(Toad)中等待提交或回滚的另一个会话(autosys)

匿名块的结束错误:

END;

spool off;
exit;
/
。。。应该是:

END;
/

spool off;
exit;
您已将
spool off
exit
命令包含在块中,这意味着块将出错。然而,这可能也不对;您说过这是从另一个脚本调用的,如果您依赖父脚本中的事务控制,则表示它是通过
@
或类似的脚本调用的;但是在这个脚本中有一个
exit
,会导致父脚本在子脚本完成时退出,这不是您想要的

但这并不能解释你看到了什么@舒里克可能是对的。您说过事务控制在父脚本中,但听起来您在Toad中独立运行了这个单子脚本,这意味着父脚本没有运行,因此父脚本的任何提交或回滚都是无关的。您必须在Toad中提交或回滚,否则Autosys版本将被阻止,永远等待Toad版本释放其持有的所有锁


很可能存在性能问题和调整,jonearles已经指出了一些起点;但是你必须首先确保它在做任何事情。

我们怎么可能知道呢?你没有提供足够的数据。我建议你在你的会议上,找出需要更多时间的陈述,并更新你的问题。简明扼要。嗨,文森特,你能告诉我你还需要什么信息吗?在将查询合并到一个查询之前,我已经单独运行了这些查询(因为在一个脚本中运行它们是原始的req)是的,这里的信息确实不够。我假设所用的时间是在插入到。。。选择…语句,但这些语句可能会插入几行或几百万行。我建议您在这里逐一检查每一条语句,并在执行过程中检查执行计划。这里有许多潜在的问题,您需要坐下来与DBA或其他Oracle程序员交谈。首先,该过程需要更好的日志记录,以便您可以轻松跟踪每个步骤所需的时间。在流程运行时,与DBA坐下来,看看这些语句在做什么——查看计划、资源、阻塞会话等,您需要定义这些数据的重要性。如果硬件出现故障,是否可以丢失此数据并重新运行以重新生成结果?如果是这样,
TRUNCATE
而不是
DELETE
,并且
/*+PARALLEL APPEND*/
提示可能会使这个过程运行快很多倍。嗨,schurik,我的错,我忘了提到,提交是在另一个脚本中调用的,它充当父脚本。该父脚本调用许多其他子脚本。这有助于我们不必重新编写一些自定义命令,以便在子脚本中反复使用(Commit就是其中之一)。