次に、ORDER / NOORDERに関係なく、シーケンスをNOCACHEに変更した場合、順序付けを実行できますか。
はい。NOCACHEは、増分ごとにsys.seq $テーブルへの書き込みを強制しているため、効果的に順序付けられます。これは、ノード上でもシリアル化する必要があります。
-
私はその可能性のある重複で受け入れられた答えに異議を唱えます。 RACのCACHE+ORDERとNOCACHEには大きな違いがあります。 ORDERでCACHEを否定しているわけではありません。その効果を減らすだけです。個人的には、中間層アプリケーションがシーケンスでNOCACHEを使用し、一度に複数のノードにアクセスしていたため、パフォーマンスが大幅に低下するのを確認しました。シーケンスをORDERCACHEに切り替えました(クロスラックオーダーが必要だったため)。パフォーマンスが大幅に向上しました。
要約すると、シーケンス速度は「CACHE NOORDER」->「CACHEORDER」のように最速から最遅になり、「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分にジャンプしました。
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分CACHEORDER=25秒
キャッシュの順序については、OracleはRACノード間で多くのpingを実行しますが、実行しない すべてメモリ内で行われるため、キャッシュサイズが使い果たされるまで、seq$にデータを書き戻す必要があります。
私があなたなら、適切なキャッシュサイズを設定し(オラクルはすべての数値をRAMに保存しないため、キャッシュサイズが大きくてもボックスメモリに負荷がかかりません。現在の数値と最終的な数値のみが格納されます)、検討します。必要に応じて注文してください。