Oracleターゲットで有効
SharePlexがターゲットテーブルでUPDATEやDELETE を実行すると、OracleはSharePlexで最も効率的なインデックスを選択しないことがあります。適切なインデックスがないと、複数のUPDATEやDELETEが実行されるときに、Postプロセスの処理速度が低下します。SharePlexでは、OracleのINDEXヒントを使用して、ターゲットオブジェクトで適切なインデックスを強制的に使用させることができます。
INDEXヒントを使用するには、hints.SIDファイルを使用します。ここで、SIDはターゲットインスタンスのORACLE_SIDです。Postは、SQLステートメントを適用するときにヒントファイルを読み込みます。ファイルにエントリが含まれている場合、Postはデータをメモリに読み込んでから、処理する各UPDATE文とDELETE文をチェックします。これらの操作のいずれかがヒントファイルにリストされたテーブルを含む場合、PostはヒントをOracleに送信します。
ヒントが必要なテーブルにのみヒントを使用します。例えば、定義されたインデックスがあるテーブルに対してPostがフルテーブルスキャンを行うと、ヒントはそれらのテーブルだけで使用されます。ヒントを使用すると、Postはhints.SIDファイルを読み込んで、ファイルに記載されているテーブル上の各操作用に使用します。多数のテーブルがリストされていると、処理速度が低下する場合があります。
ヒント(テーブルとインデックスのペア)のデフォルトの最大数は100です。この値はSP_OPO_HINTS_LIMITパラメーターで調整できます。詳細については『SharePlexリファレンスガイド』を参照してください。
すべてのインデックスが有効であることを確認します。SharePlexは無効なインデックスをヒントとして使用しますが、Oracleは無効なヒントを無視し、エラーは返しません。SharePlexは、指定されたヒントに関連する異常な状態を検出した場合、event_Logに以下の情報を書き込みます。
15050 – hint file not found(ヒントファイルが見つかりません)
17000 – error opening hint file(ヒントファイルを開くときにエラーが発生しました)
15051 – missing column in the hint file (either table or index name)(ヒントファイルに列がありません(テーブルまたはインデックス名))
15052 – syntax error for tablename(tablenameのシンタックスエラー)
15053 – syntax error for indexname(indexnameのシンタックスエラー)
15054 – source table’s object_id not found in object cache(ソーステーブルの object_id がオブジェクトキャッシュで見つかりませんでした)
15055 – more than 20 valid entries were entered into the hints file(ヒントファイルに有効なエントリが21件以上入力されました)
ヒントファイルを使用するには:
空白のhints.SIDファイルが、各システム上のSharePlex変数データディレクトリにあります。hints.SIDファイルは、targetシステムにあるものを使用します。ヒントファイルがない場合は、このディレクトリに作成し、その際にhints.SIDの命名形式を必ず使用してください。
コメント行以外の行で以下のテンプレートを使用し、ソーステーブルとそのテーブルに使用するインデックスを指定します。テーブル名とインデックス名の間には少なくとも1つのスペースを入れます。各指定は別の行に配置します。
"src_owner"."table" |
"tgt_owner"."index" |
"scott"."emp" |
"scott"."emp_index" |
SharePlexは、頻繁に使用されるSQLステートメントを再利用できるようにキャッシュし、繰り返し使用されるたびに解析やバインドを行う必要がないようにします。これはSharePlexの調整可能な機能で、SQL Cacheと呼ばれます。この機能は、アプリケーションが生成する繰り返しステートメントの量に応じて、その利点を最大限に生かすように調整することができます。
SQLキャッシュがPostのパフォーマンスを向上させるのは、同じSQLステートメントが何度も発行され、データ値以外に変化がない場合に限られます。これがお客様の環境に当てはまらない場合、SQLキャッシュはPostプロセスに不要なオーバーヘッドを追加するため、無効にする必要があります。
すべて
SQLキャッシュを以下のように制御します。
パラメーター | 説明 |
---|---|
SP_OPO_SQL_CACHE_DISABLE |
SQLキャッシュを有効または無効にします。デフォルトでは有効になります(0に設定)。SQLキャッシュを無効にするには、パラメーターを1に設定します。SQLキャッシュをバッチ処理でのみ無効にするには、パラメーターを3に設定します。これによりPostが使用するメモリが減少します。 |
SP_OPO_MAX_CDA |
Postセッションごとにキャッシュするアクティブなステートメントの数を決定します。デフォルトでは、Postは1セッションごとに50個のカーソルを開きます。この設定は必要に応じて増減できます。詳細については、オープンカーソルの調整を参照してください。 |
パラメーター | 説明 |
---|---|
SP_OPX_SQL_CACHE_DISABLE |
SQLキャッシュを有効または無効にします。デフォルトでは有効になります(0に設定)。SQLキャッシュを無効にするには、パラメーターを1に設定します。 |
targetコマンドを使用します。 target r.database [queue queuename] set resources max_active_statements=number_of_active_statements |
Postセッションごとにキャッシュするアクティブなステートメントの数を決定します。Open Targetデータベースの場合、Postは、ODBCドライバから許可されたアクティブなステートメントの数を取得します。この値がmax_active_statementsの設定よりも小さい場合、Postは停止してエラーを返します。SQLキャッシュ機能を無効にするか、max_active_statementsの値を小さくすることができます。 |
以下の手順に従って、アクティブなステートメントの数が複製される操作に最適であることを確認してください。
Oracleターゲットで有効
OracleのパラメーターOPEN_CURSORSの値は、Postプロセスに期待されるパフォーマンスレベルをサポートするために十分に大きい値に設定する必要があります。このパラメーターは、プロセス(Postなど)が開くことができるカーソルの最大数を定義します。
内部的に、PostはOPEN_CURSORSの値からルーチン呼び出しに必要な10個を除いたオープンカーソルの最大総数を設定します。この値はevent_logで確認できます。以下の例では、OPEN_CURSORSは512に設定されています。
Notice: sp_opst_mt (for o.oracle-o.oracle queue oracle) Post will not open more than 502 cursors (OPEN_CURSORS – 10).
Postは開いているカーソル数の記録を保持します。Postはカーソルの最大数を超えることを検出した場合、最も長い間使用されていないセッション内の最も長い間使用されていないカーソルを閉じます。
カーソル不足を回避するために、Postプロセスは開始時にOPEN_CURSORSの値を問い合わせます。この値が十分でない場合、Postは以下の警告をevent_logに書き込みます。
Warning: (sp_opst_mt for o.oracle-o.oracle queue oracle)Oracle parameter 'OPEN_CURSORS' is < number. Check 'OPEN_CURSORS' setting.
OPEN_CURSORSの値は、変更することも、ない場合に追加することもできます。
OPEN_CURSORSの値を表示するには、以下のSQLステートメントを使用してデータベースに問い合わせます。
select value from v$parameter where name = 'open_cursors';
Postプロセスに十分なOPEN_CURSORSの値を見積もるには:
以下の式を使用して、SharePlex(およびターゲットデータにアクセスする可能性のある他のアプリケーション)をサポートするためのOPEN_CURSORSの適切な設定を決定します。
SQLキャッシュが有効(デフォルト): デフォルトでは、Postは、終了すると閉じるルーチン呼び出しのために10個のカーソルと、トランザクションごとに少なくとも7個のカーソルを確保する必要があります(基本は少なくとも2個と追加の5個)。計算式は以下の通りです。
10 + (同時トランザクションのピーク数 x 7) =必要な最小限のオープンカーソル数
SQLキャッシュが無効: Postプロセスは、終了すると閉じるルーチン呼び出しのために10個のカーソルと、トランザクションごとに少なくとも2個のカーソルを確保する必要があります。計算式は以下の通りです。
10 + (同時トランザクションのピーク数 x 2) =必要な最小限のオープンカーソル数
Oracleターゲットで有効
アプリケーションのパッチやその他のOracleの内部操作で適用される大規模トランザクションは、ユーザアプリケーションに必要なデータと関連がない場合、レプリケーションから除外できます。これらの操作は、Postによって適用されるSharePlexの数千または数百万の個別のUPDATE文またはDELETE文に変換することができます。このようなトランザクションは、ポストのパフォーマンスに悪影響を及ぼし、ユーザアプリケーションの作業実行に必要なソースデータとターゲットデータ間のレイテンシを増加させる可能性があります。他のDML操作がターゲットデータベースにポストされるのを防止する理由があるかもしれません。
このようなトランザクションの取り扱いには以下の2つの方法があります。
メンテナンスDMLをスキップするには:
注意: SHAREPLEX_IGNORE_TRANSプロシージャの影響を受けるのはDML操作のみです。SharePlexにTRUNCATEを含むDDL操作をスキップさせることはありません。DDL操作はOracleによって暗黙的にコミットされるため、プロシージャは無効になります。
© ALL RIGHTS RESERVED. 利用規約 プライバシー Cookie Preference Center