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

ストリームプールにだまされてはいけません

    従来の知識は、それほど一般的ではない、または一般的ではない場合があります。事例として、DBAは、STREAMSプールがストリームプロセス専用に予約されていると信じている場合があります。 Data PumpやGoldenGateなどの他のOracleユーティリティがそのプールを使用するため、これは当てはまりません。もちろん、動的管理の使用を選択すると、要求があったときに必要なメモリが自動的に割り当てられますが、そのメモリはどこかから取得する必要があります。 Oracleは、バッファキャッシュから必要なものを「盗み」、すぐに置き換えられることはありません。 DataPumpを使用してこれを証明する例を見てみましょう。

    'victim'は、streams_pool_sizeが0に設定されたOracle 12.1.0.2データベース(Streamsが構成されていないため、プールは使用されないことが期待されます)および自動共有メモリ管理が構成されます(sga_targetおよびsga_max_sizeパラメーターはゼロ以外の値に設定):

    SQL> --
    SQL> -- The streams pool is NOT just for
    SQL> -- Streams
    SQL> --
    SQL> -- Data pump and GoldenGate both use
    SQL> -- it
    SQL> --
    SQL> -- Not setting a size for the streams
    SQL> -- pool can cause problems when it is
    SQL> -- first used
    SQL> --
    SQL> --
    SQL> -- Looking at the database parameters
    SQL> -- check the sga parameters
    SQL> -- for sizing
    SQL> --
    SQL> show parameter sga
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     TRUE
    sga_max_size                         big integer 600M
    sga_target                           big integer 600M
    unified_audit_sga_queue_size         integer     1048576
    
    

    現在のサイズがゼロ以外のコンポーネントのV$SGA_DYNAMIC_COMPONENTSビューを確認すると、次の結果が返されます。

    SQL> 
    SQL> column component format a29
    SQL> set linesize 300 numwidth 12
    SQL> 
    SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz,
      2  oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size
      3  from v$sga_dynamic_components
      4  where current_size > 0;
    
    COMPONENT                     CURRENT_SIZE     MIN_SIZE     MAX_SIZE USER_SPEC_SZ   OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE
    ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------
    shared pool                      176160768    146800640    176160768            0            6 GROW          DEFERRED  15-OCT-19      4194304
    large pool                         8388608      8388608    125829120            0            1 SHRINK        DEFERRED  15-OCT-19      4194304
    java pool                          4194304      4194304      4194304            0            0 STATIC                                 4194304
    DEFAULT buffer cache             411041792    301989888    419430400            0            8 SHRINK        DEFERRED  15-OCT-19      4194304
    Shared IO Pool                    20971520            0     20971520            0            1 GROW          IMMEDIATE 15-OCT-19      4194304
    
    SQL> 
    
    

    streams_pool_sizeが0に設定されていることを確認します:

    SQL> 
    SQL> --
    SQL> -- Verify the streams pool is set to
    SQL> -- 0
    SQL> --
    SQL> show parameter streams
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    streams_pool_size                    big integer 0
    SQL> 
    
    

    データポンプのエクスポートが実行され、その後、動的メモリコンポーネントのサイズがチェックされます。

    SQL> 
    SQL> --
    SQL> -- Run an Data Pump export task
    SQL> -- and see what happens to the streams
    SQL> -- pool size
    SQL> --
    SQL> !expdp parfile=expdp_test.par
    
    SQL> 
    SQL> column component format a29
    SQL> set linesize 300 numwidth 12
    SQL> 
    SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz,
      2  oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size
      3  from v$sga_dynamic_components
      4  where current_size > 0;
    
    COMPONENT                     CURRENT_SIZE     MIN_SIZE     MAX_SIZE USER_SPEC_SZ   OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE
    ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------
    shared pool                      197132288    146800640    197132288            0           11 GROW          IMMEDIATE 15-OCT-19      4194304
    large pool                         8388608      8388608    125829120            0            1 SHRINK        DEFERRED  15-OCT-19      4194304
    java pool                          4194304      4194304      4194304            0            0 STATIC                                 4194304
    streams pool                       8388608            0      8388608            0            2 GROW          IMMEDIATE 15-OCT-19      4194304
    DEFAULT buffer cache             381681664    301989888    419430400            0           15 SHRINK        IMMEDIATE 15-OCT-19      4194304
    Shared IO Pool                    20971520            0     20971520            0            1 GROW          IMMEDIATE 15-OCT-19      4194304
    
    6 rows selected.
    
    SQL> 
    

    DEFAULTバッファキャッシュサイズが初期設定の411041792から381681664に減少したことに注意してください。これは、一部はStreamsプールの「資金調達」に役立ちます。そのアイデアをテストするには、streams_pool_sizeを8M(Oracleが動的に設定した値)に設定し、テストを可能な限り等しくするために、データベースをシャットダウンして開始します。

    SQL> 
    SQL> --
    SQL> -- Set the streams_pool_size to the current
    SQL> -- value
    SQL> --
    SQL> -- Shutdown and startup the database
    SQL> --
    SQL> alter system set streams_pool_size=8M scope=spfile;
    
    System altered.
    
    SQL> 
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area    629145600 bytes
    Fixed Size                    2927528 bytes
    Variable Size               289408088 bytes
    Database Buffers            331350016 bytes
    Redo Buffers                  5459968 bytes
    Database mounted.
    Database opened.
    

    開始値をチェックする動的メモリパラメータ:

    SQL> 
    SQL> --
    SQL> -- Check dynamic sizing of SGA components
    SQL> --
    SQL> column component format a29
    SQL> set linesize 300 numwidth 12
    SQL> 
    SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz,
      2  oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size
      3  from v$sga_dynamic_components
      4  where current_size > 0;
    
    COMPONENT                     CURRENT_SIZE     MIN_SIZE     MAX_SIZE USER_SPEC_SZ   OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE
    ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------
    shared pool                      155189248    146800640    155189248            0            2 GROW          IMMEDIATE 15-OCT-19      4194304
    large pool                       125829120    125829120    125829120            0            0 STATIC                                 4194304
    java pool                          4194304      4194304      4194304            0            0 STATIC                                 4194304
    streams pool                       8388608      8388608      8388608      8388608            0 STATIC                                 4194304
    DEFAULT buffer cache             327155712    327155712    335544320            0            2 SHRINK        IMMEDIATE 15-OCT-19      4194304
    
    SQL> 
    SQL> --
    SQL> -- Remove the previous dump file
    SQL> --
    SQL> !/bin/rm /u01/app/oracle/admin/orcl/dpdump/scott.*
    

    調整したメモリプール設定を使用して、データポンプジョブを再度実行します。

    SQL> 
    SQL> --
    SQL> -- Run an Data Pump export task
    SQL> -- and see what happens to the streams
    SQL> -- pool size
    SQL> --
    SQL> !expdp parfile=expdp_test.par
    
    SQL> 
    SQL> column component format a29
    SQL> set linesize 300 numwidth 12
    SQL> 
    SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz,
      2  oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size
      3  from v$sga_dynamic_components
      4  where current_size > 0;
    
    COMPONENT                     CURRENT_SIZE     MIN_SIZE     MAX_SIZE USER_SPEC_SZ   OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE
    ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------
    shared pool                      197132288    146800640    197132288            0           12 GROW          IMMEDIATE 15-OCT-19      4194304
    large pool                         8388608      8388608    125829120            0            1 SHRINK        DEFERRED  15-OCT-19      4194304
    java pool                          4194304      4194304      4194304            0            0 STATIC                                 4194304
    streams pool                       8388608      8388608      8388608      8388608            0 STATIC                                 4194304
    DEFAULT buffer cache             381681664    264241152    381681664            0           14 GROW          DEFERRED  15-OCT-19      4194304
    Shared IO Pool                    20971520            0     20971520            0            1 GROW          IMMEDIATE 15-OCT-19      4194304
    
    6 rows selected.
    
    SQL> 
    

    前の例のように減少するのではなく、DEFAULTバッファキャッシュが増加したことに注意してください。バッファキャッシュからメモリが「盗まれる」ことはなかったため、リソースの動的なシフトによってパフォーマンスが低下することはありませんでした。 streams_pool_sizeを0に設定する際に発生する可能性のある問題は、ストリームプールの拡張と同時にバッファキャッシュが縮小したため、ストリームプールが割り当てられた時点でのパフォーマンスの低下である可能性があります。これは、最初からユーザーの負荷がかなり重いシステムで特に顕著になる可能性があります。

    前述のように、GoldenGateはストリームプールも使用し、抽出プロセスの開始時にコミットアクティビティが多いため、抽出プロセスが起動アクティビティを終了するまで続く、サービスの重大な低下を示す可能性があります。 [GoldenGateによって生成された他のプロセスは、コミットされたデータをREDOログにフラッシュするグローバルログファイルの同期などの速度低下の原因になります。]抽出プロセスが開始されたときに1つのシステムがひどく苦しみ、割り当てられたオペレーティングシステムのログインを完了できませんでした。そのサーバーで実行されているデータベースが使用できなくなったことをサードパーティの監視ソフトウェアが報告するようになります。 streams_pool_sizeをゼロ以外の値に設定すると、抽出プロセスが開始されたときの全体的なパフォーマンスの向上に大きく貢献しました。

    一般的な知識は両刃の剣である可能性があります。常識が当てはまるすべての場合について、当てはまらない場合が1つ以上ある可能性があります。唯一の本当の解決策は、そのような「知恵」をテストして、その正確さを検証することです。 「知恵」が誤っていたという仮定を発見するためだけに「福音」のような「知識」をとるよりも、そのような調査でテスト、開発、または「サンドボックス」システムに影響を与える方がはるかに優れています。知ることは推測することよりも優れています。調査に少し時間を費やすと、Oracleが関与する新しいプロセスを実装するときに大きなメリットを得ることができます。

    ###

    DavidFitzjarrellの記事を見る


    1. 高度なMySqlクエリ:別のテーブルからの情報でテーブルを更新します

    2. MySQLでテーブルの文字セットと照合を設定する方法

    3. MySQLでBLOBからTEXTに変換するにはどうすればよいですか?

    4. 一括更新および削除操作を実行する際のPostgreSQLデッドロックの回避