2012-03-06 11 views
2

VBAモジュールを使用して、6時間ごとにOracle Database表に千以上の行を挿入する必要があります。毎回の実行中にVBAで複雑な予測計算が行われ、その結果の値をデータベースに挿入する必要があります。行をOracle DBに挿入する際にパフォーマンスを向上させる方法はありますか?

典型的な出力範囲は、1000行以上13列です。

現在、私は行単位で挿入し、さらに各挿入後に自動コミットを実行します(ADO DB デフォルトの)。ここでパフォーマンスを向上させるためのより良い方法やプロセスがありますか?

現在、サーバの負荷によって20〜40分かかります。パフォーマンスの改善提案。 APPENDヒントを使用して

  • はVBAわからない場合に役立ちます

  • +0

    私はその時間がOracleでどれくらいで、VBAにどれくらいの時間があるのだろうか。 DBMS_MONITOR.SESSION_TRACE_ENABLEを使用して拡張されたSQLトレースを使用すると、時間の使用場所を特定するのに役立ちます。 –

    +0

    これは1000行では非常に遅いです。挿入物をパラメータ化しようとしましたか?ただ一つのコミットをするだけでも速くなります。 –

    +0

    すべての挿入後にADO DBの自動コミットが行われていますが、私は以下のJens Schauder氏のコメントを調べています。 –

    答えて

    3
    1. は(もう)(これはあなたの要件に対応している場合)

    2. すべての挿入後にコミットを検討しないでくださいバッチ挿入を探します。つまり、1つの挿入文ではなく複数の文を単独で挿入するものです。

    3. 準備文の使用

    4. 挿入

    +0

    これは良い点です。私は、#1、#4、#3が最も重要で、#2と#5はかなり高いレベルでの最適化だと思います。 – Codo

    +0

    ありがとうございました。上記の点についてもう少し詳しく調べようと思います –

    0

    時の制約を無効にしてみてくださいあなたには受け入れられないかもしれないが、テーブルの上にすべてのインデックスを削除してから一度行って再作成すると役立つだろう。 (各INSERTのインデックスを更新しなければならないオーバーヘッドを節約します)

    +0

    同じテーブルを使用していてインデックスを作成したり削除したりするプロセスが1000行しかないため、これは良いオプションだと思いません。それが百万のようだったら、これは彼らの道でした。 –

    0

    私はこの問題を自分自身持っていました。私の問題は、私が各インサートの接続を開いたり閉じたりしていたことでした。つまり、約1000行をインポートするのに15分を使用しました。

    私は、接続を開いたままにして、ループを使用して新しい実行文をDBに送信してから、接続をもう一度閉じて解決しました。

    これは私のVBAです:

    ' Setup the connection to the DB 
    Set conn = New ADODB.Connection 
    strConnection = "Provider=OraOLEDB.oracle;Data Source=connectionstring;User Id=username;Password=yourpasswrod;" 
    
    ' Open DB connection 
    conn.ConnectionString = strConnection 
    conn.Open 
    
    Do Until IsEmpty(ActiveCell) 
        conn.Execute ("insert into my_table (user, user_info) values ('1', '" & ActiveCell.value &"')") 
    Loop 
    
    conn.Close 
    Set conn = Nothing 
    

    これは、約30秒までのInportする時間をredused。 :)

    関連する問題