次に、ORDER/NOORDER に関係なく、シーケンスを NOCACHE に変更すると、順序付けを達成できますか。
はい、NOCACHEは、各インクリメントでsys.seq $テーブルへの書き込みを強制しているため、効果的に順序付けられているため、ノード上でもシリアル化する必要があります。
--
その可能性のある重複で受け入れられた回答に異議を唱えます。CACHE + ORDER と RAC の NOCACHE には大きな違いがあります。ORDER で CACHE を否定しているわけではありません。効果を下げるだけです。私は個人的に、シーケンスで NOCACHE を使用し、一度に複数のノードにアクセスしていたため、中間層アプリケーションのパフォーマンスが大幅に低下するのを見てきました。私たちは彼らのシーケンスを ORDER CACHE に切り替えました (彼らは人種間の注文を望んでいたため)。とパフォーマンスが大幅に向上しました。
要約すると、シーケンス速度は、「CACHE NOORDER」->「CACHE ORDER」のように最速から最も遅くなり、「NOCACHE」のはるか後ろになります。
これも簡単にテストできます。
したがって、標準的なシーケンスから始めます。
SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;
Sequence created.
つまり、順序のない CACHE です。ここで、2 つのセッションを開始します。このテストでは、4 ノードの RAC データベース 10.2.0.4 を使用しています。
私のテストスクリプトは単純です
select instance_number from v$instance;
set serverout on
declare
v_timer timestamp with time zone := systimestamp;
v_num number(22);
begin
for idx in 1..100000
loop
select daz_test.nextval into v_num from dual;
end loop;
dbms_output.put_line(systimestamp - v_timer);
end;
/
/
ここで、最初のテスト (CACHE NOORDER) を実行します。
SESSION 1 SESSION 2
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
+000000000 00:00:07.309916000 +000000000 00:00:07.966913000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
+000000000 00:00:08.430094000 +000000000 00:00:07.341760000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
したがって、シーケンスの 100,000 回の反復を選択するのに 7 ~ 8 秒かかります。
ここで、NOCACHE を試してみましょう (シーケンスへの呼び出しごとに seq$ への書き込みを強制しているため、ORDER と NOORDER はこれには関係ありません)。
SQL> alter sequence daz_test nocache;
Sequence altered.
SESSION 1 SESSION 2
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
+000000000 00:08:20.040064000 +000000000 00:08:15.227200000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
+000000000 00:08:30.140277000 +000000000 00:08:35.063616000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
したがって、同じ作業セットで 8 秒から 8 MINUTES に跳ね上がりました。
CACHE + ORDERはどうですか?
SQL> alter sequence daz_test cache 100 order;
Sequence altered.
SQL> @run_test SQL> @run_test
INSTANCE_NUMBER INSTANCE_NUMBER
--------------- ---------------
2 1
+000000000 00:00:25.549392000 +000000000 00:00:26.157107000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
+000000000 00:00:26.057346000 +000000000 00:00:25.919005000
PL/SQL procedure successfully completed. PL/SQL procedure successfully completed.
つまり、100,000 回の単一呼び出しフェッチの要約 CACHE NOORDER = 8 秒 NOCACHE = 8 分 CACHE ORDER = 25 秒
キャッシュの順序については、Oracle は RAC ノード間で多くの ping を実行しますが、すべてメモリ内で行われるため、キャッシュ サイズが使い果たされるまで、seq$ にデータを書き戻す必要はありません。
私があなただったら、適切なキャッシュサイズを設定します(オラクルはすべての数値をRAMに保存しないため、キャッシュサイズが大きいとボックスメモリに負荷がかかりません。現在の数値と最終的な数値のみ)必要に応じて注文してください。