効率試験マージ
テストの説明:
(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(*)を