sql >> データベース >  >> RDS >> Oracle

Oracleでの一括収集によるパフォーマンスの向上

    一括収集を使用して、1回のフェッチ操作で複数行のデータを取得します。 1回のフェッチで複数行のデータを使用すると、ネットワークラウンドトリップの数が減り、パフォーマンスが向上します。
    次の例では、JOB_HISTORYテーブルにリストされているジョブが、従業員の仕事であると同時に、従業員がJOB_HISTORYテーブルにリストされているジョブ。
    手順の作成または置換Promotion_Rev

    IS
    old_job hr.job_history.job_id%TYPE;
    new_job hr.job_history.job_id%TYPE;
    nincr NUMBER;

    CURSOR cselectjob
    IS
    SELECT employee_id、
    start_date、
    end_date、
    job_id
    FROM hr.job_history
    ORDER BY employee_id、start_date;

    TYPE jh_rec IS RECORD(
    employee_id hr.job_history.employee_id%TYPE、
    start_date hr.job_history.start_date%TYPE、
    end_date hr.job_history.end_date%TYPE、
    job_id hr .job_history.job_id%TYPE
    );

    タイプjh_tableはjh_recのテーブルです
    PLS_INTEGERによるインデックス;

    jh_table_array jh_table;
    BEGIN
    OPEN cselectjob;

    FETCH cselectjob
    BULK COLLECT INTO jh_table_array;

    cselectjobを閉じる;

    FORカウンターINjh_table_array.FIRST.. jh_table_array.LAST
    LOOP
    IF counter =jh_table_array.LAST
    THEN
    nincr:=0;
    ELSE
    nincr :=1;
    END IF;

    old_job:=jh_table_array(counter).job_id;

    IF jh_table_array(counter).employee_id =
    jh_table_array(counter + nincr).employee_id
    THEN
    new_job:=jh_table_array(counter + nincr).job_id;
    ELSE
    SELECT job_id
    INTO new_job
    FROM hr.employees
    WHERE hr.employees.employee_id =
    jh_table_array(counter).employee_id;
    END IF;

    DBMS_OUTPUT.put_line('従業員'
    || jh_table_array(counter).employee_id
    ||'仕事がありました'
    || old_job
    ||'for'
    | |(jh_table_array(counter).end_date
    --jh_table_array(counter).start_date)
    ||'日数とジョブに移動'
    || new_job
    ||'。');
    END LOOP;
    END;
    /

    次の手順を実行します。

    serveroutputをオンに設定します;
    BEGIN
    Promotion_rev;
    END;
    /
    出力は次のようになります:

    従業員101のジョブAC_ACCOUNTは1497日間で、ジョブAC_MGRに移動しました。
    従業員101のジョブAC_MGRは1234日間で、ジョブAD_VPに移動しました。
    従業員102のジョブIT_PROGは2018日間で、ジョブAD_VPに移動しました。
    従業員114のジョブST_CLERKは647日間で、ジョブPU_MANに移動しました。
    従業員122のジョブST_CLERKは364日間で、ジョブST_MANに移動しました。
    従業員176のジョブSA_REPは282日間で、移動しました。
    従業員176のジョブSA_MANは364日間で、ジョブSA_REPに移動しました。
    従業員200のジョブAD_ASSTは2100日間で、ジョブAC_ACCOUNTに移動しました。
    従業員200のジョブAC_ACCOUNTは1644日でジョブAD_ASSTに移動しました。
    従業員201は1401日間ジョブMK_REPを使用し、ジョブMK_REPに移動しました。
    PL/SQLプロシージャは正常に完了しました。

    1. MySQL-このバージョンのMySQLは、'LIMIT&IN / ALL / ANY/SOMEサブクエリをまだサポートしていません

    2. MSSQLからMySQLに移行する方法

    3. SQL SELECT DISTINCT:パフォーマンスのベストプラクティス

    4. いつテーブル値関数を使用しますか?