2016-10-13 2 views
1

は、我々は、Oracle hetrogeneousサービスを使用してMS SQL ServerデータベースへのOracleデータベースからデータベース・リンクを作成しました。
Oracle DBには表Aがあり、SQLサーバーDBには表Bがあります。テーブルの構造は異なります。 Oracle dBからいくつかの行を選択し、Insert文を使用してデータベース・リンクを介してmssqlserver DBにプッシュします。データは、データベース・リンクを経由して、MicrosoftのSQLサーバーへのOracleからプッシュ

このクエリのパフォーマンスが遅いです。私はOracleのログをチェックしました。 HSエージェント待機イベントとは、SQL Serverが挿入と応答を終了するのを待つことを意味します。

あなたはパフォーマンスがSQLサーバ側のメソッドを改善する提案してくださいでした。 1000レコードの場合は24秒かかります。私たちの目標は100000レコードを3〜5分でプッシュすることです。私は1000回成功したインサートをコミットしています。挿入のために使用さ

問合せブロックは以下に貼り付けられます。あなたは、データベース内の高パフォーマンス(データベース・リンクの有無にかかわらず)をしたい場合は、行ごとの更新や挿入を停止し、代わりに一括操作を使用する必要があります

declare 
v_id number:=0; 
v_count number:=0; 
cursor test_cur is 
    select Post_txn_balance, 
     Toll_revenue_type, 
     Extern_file_id, 
     Card_issuer_id, 
     Card_no, 
     Tx_seq_number, 
     Recv_extn_loc_id, 
     Device_no, 
     Revenue_date, 
     TO_CHAR(Posted_date,'YYYY-MM-DD')Posted_date, 
     Purse_ind, 
     Recv_extn_sp_id, 
     Lane_tx_type, 
     Lane_id, 
     Lane_type, 
     Full_fare_amount, 
     to_char(Tx_timestamp,'YYYY-MM-DD') Tx_timestamp 
    from t_table_a 
    where rownum<=10000; 

test_cur_data test_cur%rowtype; 

begin 
     dbms_output.put_line('Going to insert 10000 records '); 
     open test_cur; 
    loop 
    fetch test_cur into test_cur_data; 
     exit when test_cur%notfound; 
    v_id:=v_id+1; 
     v_count:=v_count+1; 
    INSERT INTO "t_table_b"@sqldb1(
      "after_card_bal", 
      "app_sector", 
      "batch_number", 
      "card_issuer_id", 
      "card_number", 
      "card_status", 
      "card_txn_number", 
      "data_push_source", 
      "debit_credit_indicator", 
      "entry_loc_id", 
      "entry_loc_name", 
      "exit_loc_id", 
      "exit_loc_name", 
      "expiry_date", 
      "id_number", 
      "id_type", 
      "mfg_number", 
      "operational_date", 
      "posted_date", 
      "print_sp", 
      "lms_process_date", 
      "process_status", 
      "purse_flag", 
      "sp_id", 
      "t_type", 
      "terminal_id", 
      "terminal_type", 
      "txn_amount", 
      "txn_date_time", 
      "txn_source", 
      "txn_unique_id", 
      "ur_flag", 
      "vector_acct_number" 
     ) 
      values 
      (
      test_cur_data.Post_txn_balance, 
      test_cur_data.Toll_revenue_type, 
      test_cur_data.Extern_file_id, 
      test_cur_data.Card_issuer_id, 
      test_cur_data.Card_no, 
      'ACTIVE', 
      test_cur_data.Tx_seq_number, 
      'C', 
      'D', 
      '503', 
      'MALYASY', 
      test_cur_data.Recv_extn_loc_id, 
      'MALYASY', 
      '01-mar-2016', 
      'ABCD123', 
      'DFED12', 
      test_cur_data.Device_no, 
      test_cur_data.Revenue_date, 
      test_cur_data.Posted_date, 
      '-04', 
      '01-mar-2016', 
      'P', 
      test_cur_data.Purse_ind, 
      test_cur_data.Recv_extn_sp_id, 
      test_cur_data.Lane_tx_type, 
      test_cur_data.Lane_id, 
      test_cur_data.Lane_type, 
        test_cur_data.Full_fare_amount, 
        test_cur_data.Tx_timestamp, 
      'T', 
      v_id, 
      'P', 
      '123456' 
      ); 
     IF v_count=1000 then 
     commit; 
     v_count:=0; 
     end if; 
     end loop; 
     commit; 
    v_id:=0; 
    v_count:=0; 
    EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Error while pushing data'||sqlerrm); 
    ROLLBACK; 
end; 
/

答えて

0

、一度に大量のデータを書き込み、すなわちSQL文。

だから、すべてのPL/SQLのものを忘れ、ちょうどこの単一のINSERT文を実行します。

INSERT INTO "t_table_b"@sqldb1(
    "after_card_bal", 
    "app_sector", 
    "batch_number", 
    "card_issuer_id", 
    "card_number", 
    "card_status", 
    "card_txn_number", 
    "data_push_source", 
    "debit_credit_indicator", 
    "entry_loc_id", 
    "entry_loc_name", 
    "exit_loc_id", 
    "exit_loc_name", 
    "expiry_date", 
    "id_number", 
    "id_type", 
    "mfg_number", 
    "operational_date", 
    "posted_date", 
    "print_sp", 
    "lms_process_date", 
    "process_status", 
    "purse_flag", 
    "sp_id", 
    "t_type", 
    "terminal_id", 
    "terminal_type", 
    "txn_amount", 
    "txn_date_time", 
    "txn_source", 
    "txn_unique_id", 
    "ur_flag", 
    "vector_acct_number" 
    ) 
SELECT 
    Post_txn_balance, 
    Toll_revenue_type, 
    Extern_file_id, 
    Card_issuer_id, 
    Card_no, 
    'ACTIVE', 
    Tx_seq_number, 
    'C', 
    'D', 
    '503', 
    'MALYASY', 
    Recv_extn_loc_id, 
    'MALYASY', 
    '01-mar-2016', 
    'ABCD123', 
    'DFED12', 
    Device_no, 
    Revenue_date, 
    TO_CHAR(Posted_date,'YYYY-MM-DD'), 
    '-04', 
    '01-mar-2016', 
    'P', 
    Purse_ind, 
    Recv_extn_sp_id, 
    Lane_tx_type, 
    Lane_id, 
    Lane_type, 
    Full_fare_amount, 
    to_char(Tx_timestamp,'YYYY-MM-DD'), 
    'T', 
    v_id, 
    'P', 
    '123456' 
from t_table_a; 

は、短く簡単かつ高速です。

関連する問題