sql >> データベース >  >> RDS >> Oracle

Oracleシーケンス値は順序付けられていません

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




    1. ソケット'/tmp/mysql.sockを介してローカルMySQLサーバーに接続できません

    2. 2000年と2005年のデータベースがあるSQLServer2008のリンクサーバーを作成する方法

    3. MySQLクエリ結果をCSV形式で出力するにはどうすればよいですか?

    4. pg gemをインストールしようとすると、'libpq-fe.hヘッダーが見つかりません