11

重複の可能性:
Oracle RAC とシーケンス

ローカル環境で Oracle RAC を構成しています。nextVal によって生成された番号が順序付けられていないという Sequence の問題を分析しました。最初に値を 1 として取得し、2 回目に値を 21 として取得するとします (デフォルトの CACHE 20 および NOORDER と同様にシーケンスを構成しました)。

検索すると、シーケンスを注文する必要があるという解決策が見つかりました。どちらのオプションを選択するのが良いかという質問がありますが、

1) キャッシュとオーダー

2) NOCACHEとORDER

上記のどれがより良いオプションであり、その理由を知りたいですか?

次に、ORDER/NOORDER に関係なく、シーケンスを NOCACHE に変更すると、順序付けを達成できますか。

ありがとう

4

1 に答える 1

17

次に、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に保存しないため、キャッシュサイズが大きいとボックスメモリに負荷がかかりません。現在の数値と最終的な数値のみ)必要に応じて注文してください。

于 2012-11-22T15:27:22.323 に答える