2017-10-04 10 views
1

Javaコードからシーケンス値を取得しようとしています。javaによるシーケンスnextValの取得は、テーブルで選択クエリを実行するよりも高速ですか?

Select sequence.nextVal from dual; 

このクエリは、通常の選択クエリよりも高速に実行されますか? シーケンスの値がキャッシュされると混乱します。したがって、これらの値はRAMに格納されるため、検索が高速になりますか?

ありがとうございました。

+0

それはより速く、おそらくだが、まだデータベースによって行われることになるだろう。これはJavaとは関係ありません。それは非常に簡単なオペラですので、より高速になるでしょう、データベースはクエリの結果をキャッシュすることもできます。 – Oleg

+1

クエリの値をキャッシュすることもできます。実際にJavaとOracleの間の処理を高速化したい場合は、ビジネスロジックをストアドプロシージャに移動し、複数の前後にシーケンス値を取得し、複数の変数を更新するのではなく、Javaから呼び出してストアドプロシージャを呼び出しますテーブルを別々の要求に入れます。 – MT0

+0

私のアプリケーションに挿入されたばかりのシーケンスの値が必要です。したがって、シーケンスから値を取得して、別の挿入クエリを実行してその値を挿入しています。他の方法はありますか? – Genius

答えて

2

何が速いのかを尋ねて、ソリューションを時期尚早に最適化しようとしています。答えにかかわらず、外部アプリケーション(例えば、Java)とOracleデータベースとの間の要求は、データベース内のシーケンスまたはクエリを検索するよりも遅い可能性がある。

ハードドライブから検索するのではなく、キャッシュされた値を取るため、データベースの内部部分が数マイクロ秒を節約できるかどうかを調べる前に、Javaからデータベースへの呼び出し回数を減らしてください。

私のアプリケーションに挿入されたばかりのシーケンスの値が必要です。したがって、シーケンスから値を取得して、別の挿入クエリを実行してその値を挿入しています。他の方法はありますか?

JavaとOracleの間に複数のラウンドトリップを防ぐために、ストアドプロシージャを使用します。

CREATE PROCEDURE add_data(
    in_value1  IN YOUR_TABLE.VALUE1%TYPE, 
    in_value2  IN YOUR_TABLE.VALUE2%TYPE, 
    in_other_value IN OTHER_TABLE.VALUE%TYPE, 
    out_id   OUT YOUR_TABLE.ID%TYPE, 
    out_succcess OUT VARCHAR2 
) 
IS 
BEGIN 
    INSERT INTO your_table (id, value1, value2) 
    VALUES (your_table_seq.NEXTVAL, in_value1, in_value2) 
    RETURNING id INTO out_id; 

    INSERT INTO other_table(id, value) 
    VALUES (out_id, in_other_value); 

    out_success := 'Ok' 
EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
    ROLLBACK; 
    out_id  := NULL; 
    out_success := 'Already exists!'; -- Handle exceptions 
END; 
/
0

シーケンスはデータベースバッファキャッシュにキャッシュされるため、次の値へのアクセスは非常に高速です。 oracleが新しいシーケンス番号を生成するのを待つことを避けるために、シーケンスキャッシュをワークロードに適合させる必要があります。 シーケンスの照会は、通常の照会と比較できません。

関連する問題