マージ効率のテスト効率をマージ

効率試験マージ

 

テストの説明:

(Bは、同じ主キーを記録することは、表Bのデータを更新するために、表Aに使用される場合、表Bが存在し、テーブルデータシートAに挿入された)、シーンデータの同期のために非常に適している、すなわち、提供される特別な構文SQLオラクルであるMERGEデータ同期標準的な慣行は、最初に挿入しようとした後、更新に失敗しまし挿入し、従来の手法よりもはるかに高い効率をマージすることです。(特にA及びBテーブルが一貫、複数の主キー違反の同期化は、効率は10倍以上の差であってもよいです)

MERGEの効率性を検証するために、私は2つのテーブルを建て、tab_test_C(初期化が50,000レコードを生成)とtab_test_Qは(初期化がtab_test_Cから40,000レコードを生成する)、彼らは見て、tab_test_Qにそれぞれtab_test_Cデータ同期、2つのPLSQLスクリプトを書きました違いの効率。

従来の第1のインサートを使用して、2番目のスクリプトをマージ構文を使用して最初のスクリプトは、主キー違反動作が発生します。


試験結果:
 使用同期データは、スクリプトの構文をマージ0.04秒かかり、14.77秒従来の時間のかかる操作を使用し、効率の369倍の差

 

テストスクリプト:

SERVEROUTPUT ON SETは
-スクリプトの実行時間を観察するために開始時間
に設定されたタイミングを
ON SET TIMEを
コードをコピー
-数据初始化
DROP TABLE tab_test_C。
TABLE tab_test_C CREATE 
    C1 VARCHAR2(512)、
    C2 VARCHAR2(512)、
    C3 VARCHAR2(512)、
    C4 VARCHAR2(512)、
    C5 VARCHAR2(512)、
    C6 VARCHAR2(512)、
    C7 VARCHAR2(512)、
    C8 VARCHAR2(512 )、
    C9 VARCHAR2(512)、
    C10 VARCHAR2(512) 
)。

DECLARE 
    v_total数。
BEGIN 
    v_total:= 0; 
    LOOPの
        EXIT WHEN v_total> = 50000; 
        中CUR(所有者、object_nameの、subobject_name、OBJECT_ID、DATA_OBJECT_ID、OBJECT_TYPEを選択するために、
            作成、LAST_DDL_TIME、タイムスタンプALL_OBJECTSからROWNUM <101)
        ループ
            tab_test_C値(cur.owner、cur.object_name、cur.subobject_name、挿入
            cur.object_id、cur.data_object_id、
            cur.object_type、cur.created、
            cur.last_ddl_time、cur.timestamp、v_total)。
            v_total:= v_total + 1。
        ループを終了します。
    END LOOP; 
    コミット; 
終わり; 
/ 

-建唯一索引
選択数(1)tab_test_Cから。
tab_test_C(C10)にUNIQUE INDEXをuid_test_c_1作成します。
コードをコピー
コードをコピー
-初期tab_test_Qテーブルデータを、同期がtab_test_C 40,000データから同期スクリプト使用して残りのデータ10000開始生成
DROP表tab_test_Qと、
CREATE TABLEがtab_test_C FROM SELECT * WHERE ROWNUM <40001 AS tab_test_Q; 
INDEX UNIQUE ON tab_test_Q(のClOをuid_test_q_1作成); 
-認証データが正常にこの時点で同期化されていないレコードの差1000の数
tab_test_QからのSELECT COUNT(*);
コードをコピー
コードをコピー
- tab_test_C tab_test_Qを同期させるためにマージデータ構文を使用して
DECLAREの
    IS CUR tab_test_CからCURSOR SELECT *を; 
    ; mergeArray_tがBINARY_INTEGERによってtab_test_C%以下の表ROWTYPEインデックスされるタイプ
    mergeArray mergeArray_t; 
BEGIN 
    OPEN CURと、
    LOOP 
        EXIT CURの%のNOTFOUND; 
        FETCH CUR収集バルクmergeArray限界16に; -各レコード数十制限、大ドットは、より効率的であるデジタル変調のためにあまりにも多くのメモリを占有しない
        BEGIN 
            IN RW FORALL 1 .. mergeArray.count。
                MERGEはINTO A tab_test_Q 
                    mergeArray(RW).C9 C9、mergeArray(RW)は二酸化塩素DUAL FROM .C10)B 
                使用する(SELECT mergeArray(RW) .C1 C1、mergeArray(RW).C2 C2、mergeArray(RW).C3 C3、mergeArray(RW).C4 C4、
                    mergeArray(RW).C5 5、mergeArray(RW).C6 6、mergeArray(RW).C7 7、mergeArray(RW).C8 8、 
                    INSERT (C1、C2、C3、C4、C5、C6、C7、C8、C9、C10)VALUES(mergeArray(RW).C1、mergeArray(RW).C2、
                ON(A.C10 = B.C10)
                MATCHED THEN 
                    UPDATE SET mergeArray A.C1 =(RW).C1、A.C2 = mergeArray(RW).C2、A.C3 = mergeArray(RW).C3、
                        A. 4 = mergeArray(RW).C4、A.C5 = mergeArray(RW).C5、
                        A.C6 = mergeArray(RW).C6、A.C7 = mergeArray(RW).C7、A.C8 = mergeArray(RW) .C8、
                        A.C9は= mergeArray(RW).C9 
                ときに一致しない
                        mergeArray(RW).C3、mergeArray(RW).C4、mergeArray(RW).C5、mergeArray(RW).C6、
                        mergeArray(RW)。 7、mergeArray(RW).C8、mergeArray(RW).C9、mergeArray(RW).C10)。
            - DBMS_OUTPUT.PUT_LINE(mergeArray.count)。 
        EXCEPTION 
            他はTHEN 
                    DBMS_OUTPUT.PUT_LINE( 'ERROR1')。
        終わり; 
    END LOOP; 
    CLOSE CUR; 
    コミット; 
終わり; 
/
コードをコピー
- 0.04秒かかった
-成功した検証データ同期
SELECT COUNT(*)をtab_test_Qから。
コードをコピー
-初期tab_test_Qテーブルデータを、同期がtab_test_C 40,000データから同期スクリプト使用して残りのデータ10000開始生成
DROP表tab_test_Qと、
CREATE TABLEがtab_test_C FROM SELECT * WHERE ROWNUM <40001 AS tab_test_Q; 
INDEX UNIQUE ON tab_test_Q(のClOをuid_test_q_1作成); 
-認証データが正常にこの時点で同期化されていないレコードの差1000の数
tab_test_QからのSELECT COUNT(*);
コードをコピー
コードをコピー
-データ同期tab_test_C tab_test_Qに正規表現を使用して
BEGIN 
    (tab_test_C SELECT * FROM)にCURため
    LOOP 
        BEGIN 
            INSERT INTO tab_test_Q(C1、C2、C3、C4、C5、C6、C7、C8、C9、のClO)
            VALUES(CUR .C1、cur.C2、cur.C3、cur.C4、cur.C5、cur.C6、cur.C7、cur.C8、cur.C9、cur.C10); 
        EXCEPTION 
            THEN DUP_VAL_ON_INDEX -一意のインデックス競合更新
                更新tab_test_Q SET C1 = cur.C1、C2 = cur.C2、C3 = cur.C3、C4 = cur.C4、C5 = cur.C5、C6 = cur.C6、C7 = cur.C7、C8 = CUR。 C8、C9 = cur.C9 
                WHERE =のClO cur.C10; 
            THEN OTHERS 
                    DBMS_OUTPUT.PUT_LINE( 'ERROR1'); 
        END; 
    エンドループ。
    A COMMIT。
終わり; 
/
コードをコピー
- 14.77秒かかった
検証データ同期に成功- 
; tab_test_QからSELECT COUNT(*)を

 

テストの説明:

(Bは、同じ主キーを記録することは、表Bのデータを更新するために、表Aに使用される場合、表Bが存在し、テーブルデータシートAに挿入された)、シーンデータの同期のために非常に適している、すなわち、提供される特別な構文SQLオラクルであるMERGEデータ同期標準的な慣行は、最初に挿入しようとした後、更新に失敗しまし挿入し、従来の手法よりもはるかに高い効率をマージすることです。(特にA及びBテーブルが一貫、複数の主キー違反の同期化は、効率は10倍以上の差であってもよいです)

MERGEの効率性を検証するために、私は2つのテーブルを建て、tab_test_C(初期化が50,000レコードを生成)とtab_test_Qは(初期化がtab_test_Cから40,000レコードを生成する)、彼らは見て、tab_test_Qにそれぞれtab_test_Cデータ同期、2つのPLSQLスクリプトを書きました違いの効率。

従来の第1のインサートを使用して、2番目のスクリプトをマージ構文を使用して最初のスクリプトは、主キー違反動作が発生します。


試験結果:
 使用同期データは、スクリプトの構文をマージ0.04秒かかり、14.77秒従来の時間のかかる操作を使用し、効率の369倍の差

 

テストスクリプト:

SERVEROUTPUT ON SETは
-スクリプトの実行時間を観察するために開始時間
に設定されたタイミングを
ON SET TIMEを
コードをコピー
-数据初始化
DROP TABLE tab_test_C。
TABLE tab_test_C CREATE 
    C1 VARCHAR2(512)、
    C2 VARCHAR2(512)、
    C3 VARCHAR2(512)、
    C4 VARCHAR2(512)、
    C5 VARCHAR2(512)、
    C6 VARCHAR2(512)、
    C7 VARCHAR2(512)、
    C8 VARCHAR2(512 )、
    C9 VARCHAR2(512)、
    C10 VARCHAR2(512) 
)。

DECLARE 
    v_total数。
BEGIN 
    v_total:= 0; 
    LOOPの
        EXIT WHEN v_total> = 50000; 
        中CUR(所有者、object_nameの、subobject_name、OBJECT_ID、DATA_OBJECT_ID、OBJECT_TYPEを選択するために、
            作成、LAST_DDL_TIME、タイムスタンプALL_OBJECTSからROWNUM <101)
        ループ
            tab_test_C値(cur.owner、cur.object_name、cur.subobject_name、挿入
            cur.object_id、cur.data_object_id、
            cur.object_type、cur.created、
            cur.last_ddl_time、cur.timestamp、v_total)。
            v_total:= v_total + 1。
        ループを終了します。
    END LOOP; 
    コミット; 
終わり; 
/ 

-建唯一索引
選択数(1)tab_test_Cから。
tab_test_C(C10)にUNIQUE INDEXをuid_test_c_1作成します。
コードをコピー
コードをコピー
-初期tab_test_Qテーブルデータを、同期がtab_test_C 40,000データから同期スクリプト使用して残りのデータ10000開始生成
DROP表tab_test_Qと、
CREATE TABLEがtab_test_C FROM SELECT * WHERE ROWNUM <40001 AS tab_test_Q; 
INDEX UNIQUE ON tab_test_Q(のClOをuid_test_q_1作成); 
-認証データが正常にこの時点で同期化されていないレコードの差1000の数
tab_test_QからのSELECT COUNT(*);
コードをコピー
コードをコピー
- tab_test_C tab_test_Qを同期させるためにマージデータ構文を使用して
DECLAREの
    IS CUR tab_test_CからCURSOR SELECT *を; 
    ; mergeArray_tがBINARY_INTEGERによってtab_test_C%以下の表ROWTYPEインデックスされるタイプ
    mergeArray mergeArray_t; 
BEGIN 
    OPEN CURと、
    LOOP 
        EXIT CURの%のNOTFOUND; 
        FETCH CUR収集バルクmergeArray限界16に; -各レコード数十制限、大ドットは、より効率的であるデジタル変調のためにあまりにも多くのメモリを占有しない
        BEGIN 
            IN RW FORALL 1 .. mergeArray.count。
                MERGEはINTO A tab_test_Q 
                    mergeArray(RW).C9 C9、mergeArray(RW)は二酸化塩素DUAL FROM .C10)B 
                使用する(SELECT mergeArray(RW) .C1 C1、mergeArray(RW).C2 C2、mergeArray(RW).C3 C3、mergeArray(RW).C4 C4、
                    mergeArray(RW).C5 5、mergeArray(RW).C6 6、mergeArray(RW).C7 7、mergeArray(RW).C8 8、 
                    INSERT (C1、C2、C3、C4、C5、C6、C7、C8、C9、C10)VALUES(mergeArray(RW).C1、mergeArray(RW).C2、
                ON(A.C10 = B.C10)
                MATCHED THEN 
                    UPDATE SET mergeArray A.C1 =(RW).C1、A.C2 = mergeArray(RW).C2、A.C3 = mergeArray(RW).C3、
                        A. 4 = mergeArray(RW).C4、A.C5 = mergeArray(RW).C5、
                        A.C6 = mergeArray(RW).C6、A.C7 = mergeArray(RW).C7、A.C8 = mergeArray(RW) .C8、
                        A.C9は= mergeArray(RW).C9 
                ときに一致しない
                        mergeArray(RW).C3、mergeArray(RW).C4、mergeArray(RW).C5、mergeArray(RW).C6、
                        mergeArray(RW)。 7、mergeArray(RW).C8、mergeArray(RW).C9、mergeArray(RW).C10)。
            - DBMS_OUTPUT.PUT_LINE(mergeArray.count)。
        EXCEPTION 
            WHEN OTHERS THEN 
                    DBMS_OUTPUT.PUT_LINE( 'ERROR1'); 
        終わり; 
    END LOOP; 
    CLOSE CUR; 
    コミット; 
終わり; 
/
コードをコピー
- 0.04秒かかった
-成功した検証データ同期
SELECT COUNT(*)をtab_test_Qから。
コードをコピー
-初期tab_test_Qテーブルデータを、同期がtab_test_C 40,000データから同期スクリプト使用して残りのデータ10000開始生成
DROP表tab_test_Qと、
CREATE TABLEがtab_test_C FROM SELECT * WHERE ROWNUM <40001 AS tab_test_Q; 
INDEX UNIQUE ON tab_test_Q(のClOをuid_test_q_1作成); 
-認証データが正常にこの時点で同期化されていないレコードの差1000の数
tab_test_QからのSELECT COUNT(*);
コードをコピー
コードをコピー
-データ同期tab_test_C tab_test_Qに正規表現を使用して-データ同期tab_test_C tab_test_Qに正規表現を使用して
BEGIN 
BEGIN 
    (tab_test_C SELECT * FROM)にCURため
    (tab_test_C SELECT * FROM)にCURため
    LOOP 
    LOOP 
        BEGIN 
        BEGIN 
            INSERT INTO tab_test_Q(C1、C2、C3、C4、C5、C6、C7、C8、C9、のClO)
            INSERT INTO tab_test_Q(C1、C2、C3、C4、C5、C6、C7、C8、C9、のClO)
            VALUES(CUR .C1、cur.C2、cur.C3、cur.C4、cur.C5、cur.C6、cur.C7、cur.C8、cur.C9、cur.C10); 
            VALUES(CUR .C1、cur.C2、cur.C3、cur.C4、cur.C5、cur.C6、cur.C7、cur.C8、cur.C9、cur.C10); 
        EXCEPTION 
        EXCEPTION 
            THEN DUP_VAL_ON_INDEX -一意のインデックス競合更新
            THEN DUP_VAL_ON_INDEX -一意のインデックス競合更新
                更新tab_test_Q SET C1 = cur.C1、C2 = cur.C2、C3 = cur.C3、C4 = cur.C4、C5 = cur.C5、C6 = cur.C6、C7 = cur.C7、C8 = CUR。 C8、C9 = cur.C9 
                WHERE =のClO cur.C10; 
            他はTHEN 
                    DBMS_OUTPUT.PUT_LINE( 'ERROR1'); 
        END; 
    エンドループ。
                更新tab_test_Q SET C1 = cur.C1、C2 = cur.C2、C3 = cur.C3、C4 = cur.C4、C5 = cur.C5、C6 = cur.C6、C7 = cur.C7、C8 = CUR。 C8、C9 = cur.C9 
                WHERE =のClO cur.C10; 
            THEN OTHERS 
                    DBMS_OUTPUT.PUT_LINE( 'ERROR1'); 
        END; 
    コミット; 
終わり; 
/
コードをコピー
- 14.77秒かかった
検証データ同期に成功- 
; tab_test_QからSELECT COUNT(*)を

 

おすすめ

転載: www.cnblogs.com/Leo_wl/p/10992684.html