Javaコードからシーケンス値を取得しようとしています。javaによるシーケンスnextValの取得は、テーブルで選択クエリを実行するよりも高速ですか?
Select sequence.nextVal from dual;
このクエリは、通常の選択クエリよりも高速に実行されますか? シーケンスの値がキャッシュされると混乱します。したがって、これらの値はRAMに格納されるため、検索が高速になりますか?
ありがとうございました。
Javaコードからシーケンス値を取得しようとしています。javaによるシーケンスnextValの取得は、テーブルで選択クエリを実行するよりも高速ですか?
Select sequence.nextVal from dual;
このクエリは、通常の選択クエリよりも高速に実行されますか? シーケンスの値がキャッシュされると混乱します。したがって、これらの値はRAMに格納されるため、検索が高速になりますか?
ありがとうございました。
何が速いのかを尋ねて、ソリューションを時期尚早に最適化しようとしています。答えにかかわらず、外部アプリケーション(例えば、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;
/
シーケンスはデータベースバッファキャッシュにキャッシュされるため、次の値へのアクセスは非常に高速です。 oracleが新しいシーケンス番号を生成するのを待つことを避けるために、シーケンスキャッシュをワークロードに適合させる必要があります。 シーケンスの照会は、通常の照会と比較できません。
それはより速く、おそらくだが、まだデータベースによって行われることになるだろう。これはJavaとは関係ありません。それは非常に簡単なオペラですので、より高速になるでしょう、データベースはクエリの結果をキャッシュすることもできます。 – Oleg
クエリの値をキャッシュすることもできます。実際にJavaとOracleの間の処理を高速化したい場合は、ビジネスロジックをストアドプロシージャに移動し、複数の前後にシーケンス値を取得し、複数の変数を更新するのではなく、Javaから呼び出してストアドプロシージャを呼び出しますテーブルを別々の要求に入れます。 – MT0
私のアプリケーションに挿入されたばかりのシーケンスの値が必要です。したがって、シーケンスから値を取得して、別の挿入クエリを実行してその値を挿入しています。他の方法はありますか? – Genius