2

複数の挿入を使用してスクリプトを作成する必要があります。私もそれを行い、Toad でスクリプトを実行しました。スクリプトは約 35 ~ 40 分で完了しました。

次に、そのスクリプトを autosys に適用し、再度実行しました (これが本来の使用方法です)。そして今度は、1.5時間以上走り続けました。

Oracle でそのアクティブなセッションを手動で強制終了する必要があります。

私のスクリプトを見て、意図した 40 分の時間枠で完了せず、1.5 時間以上実行し続けた理由を教えてください。

編集:「コミット」などの一般的なコマンドは、Autosys によって呼び出される親スクリプトで呼び出されることに言及したいと思います。私のスクリプトは、親スクリプトで呼び出された子スクリプトの 1 つです。

-- 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;
/
4

2 に答える 2

1

スクリプトに COMMIT がありません。他のセッション (autosys) が最初のセッション (Toad) でコミットまたはロールバックを待っていた可能性があります

于 2013-02-15T11:39:41.423 に答える
1

匿名ブロックの末尾が間違っています:

END;

spool off;
exit;
/

...おそらく次のようになります。

END;
/

spool off;
exit;

spool offブロック内に コマンドとコマンドを含めましたexit。これは、ブロックがエラーになることを意味します。ただし、これも正しくない可能性があります。これは別のスクリプトから呼び出されると言いましたが、親のトランザクション制御に依存している場合は、@または類似のものを介していることを意味します。ただしexit、これに があると、この子スクリプトが完了するとスクリプトが終了します。これは望ましくありません。

しかし、それはあなたが見ているものを説明していません... @schurikはおそらく正しいです。トランザクション制御は親スクリプトにあると言いましたが、Toad でこの単一の子スクリプトをスタンドアロンで実行したように聞こえます。つまり、親は実行されていないため、親のコミットまたはロールバックは関係ありません。Toad でコミットまたはロールバックする必要があります。そうしないと Autosys バージョンがブロックされ、Toad バージョンが保持しているロックを解放するのを永遠に待ちます。

パフォーマンスの問題や微調整がある可能性があり、jonearles はいくつかの出発点を指摘しています。ただし、最初に何かを実行していることを確認する必要があります。

于 2013-02-18T11:29:14.723 に答える