GAGA LIFE.

インフラエンジニアブログ

スポンサーリンク

Oracle ヒント句

Oracle ヒント句

ヒント句

オプティマイザが適切な実行計画を選択してくれない、または不具合の影響等で性能要件を満たせない実行計画になることを抑止・安定化させる。
ただし、ヒントは融通が利かないため最終手段と考えるべき。
理由としてヒントで実行計画を固定した場合、経年劣化・データや検索傾向の変化に追随することはできないため。
そのため、使用する場合には十分に考慮・検証する必要がある。

ヒント一覧

Category Hint Description
最適化目標 ALL_ROWS スループット優先指示(バッチ/BI系向き。但しOLTP的なSQL文をループで繰り返し実行するタイプのバッチを除く)
FIRST_ROWS レスポンス優先、最初のN行を最も速く返すような実行計画を立てるように指示する(OLTP向き)
アクセス
パス
INDEX
(NO_INDEX)
INDEX_ASC
INDEX_DESC
指定表の指定索引を利用する(しない)を指示。但し索引がどのようにアクセスされるかは指定できない(範囲検索ではなく全索引スキャンやスキップスキャンでアクセスされる可能性がある)。スキャン方向も制御したい場合には、INDEX_ASC/INDEX_DESCを使う
INDEX_SS(NO_INDEX_SS)
INDEX_SS_ASC
INDEX_SS_DESC
指定した索引のスキップスキャンを行うよう(行わないよう)指示する。スキャン方向も(昇順、降順)指示したい場合は、INDEX_SS_ASC/INDEX_SS_DESCを使う
FULL 指定した表を全表走査を指示する
INDEX_JOIN 指定された索引を結合したスキャンを行うよう指示する。必要な列が必要最小限の索引に含まれている必要がある。索引だけを参照する実行計画になる。
NATIVE_FULL_OUTER_JOIN
(NO_NATIVE_FULL_OUTER_JOIN)
ネイティブ完全外部結合を使用するようオプティマイザに指示する。ネイティブ完全外部結合は、ハッシュ結合に基づくネイティブ実行メソッド。
INDEX_FFS
(NO_INDEX_FFSヒント)
指定した索引を高速全索引走査を行う(行わない)よう指示
INDEX_COMBINE 指定された索引を基に内部でビットマップを作成し、作成されたビットマップを利用したスキャンを行うよう指示
結合順 ORDERED FROM句に施術された順に結合を指示(開発者が結合を順を意識してFROM句に記述する必要がある)
LEADING ヒントに記述した表の順に結合するよう指示
結合操作 USE_HASH
(NO_USE_HASHヒント)
指定された各表をハッシュ結合を使用して別の行のソースに結合するようオプティマイザに指示(ハッシュ結合をしないように指示)
USE_MERGE
(NO_USE_MERGE)
指定された各表をソート/マージ結合を使用して別の行のソースに結合するようオプティマイザに指示(ソート/マージ結合しないように指示)
USE_NL
(NO_USE_NL)
指定された表を内部表として使用し、指定された各表をネステッド・ループ結合とともに別の行のソースに結合するようオプティマイザに指示(ネステッド・ループ結合を行わないように指示)
USE_NL_WITH_INDEX 指定された表を内部表として使用し、指定された表をネストしたループ結合とともに別の行のソースに結合するようオプティマイザに指示。結合述語に対応する索引が必要。通常はUSE_NLヒントで問題ないが想定された索引が結合に利用されない場合、意図した索引を結合に利用させるために利用する
問合せ
変換
MERGE(NO_MERGE) インラインビューやビューを分解し、主問合せの結合にマージする(しない)よう指示
USE_CONCAT
(NO_EXPAND)
WHERE句のOR条件をUNION ALLを利用したクエリに書き換える(書き換えない)よう指示
REWRITE
(NO_REWRITE)
クエリブロックを対応するMV参照へ書き換える(書き換えない)よう指示
VECTOR_TRANSFORM
(NO_VECTOR_TRANSFORM)
VECTOR GROUP BYを行うか、行わせないかを指示。BI系でより効果を発揮する。RIGHT DEEP TREE形式の実行計画が選択されてもファクトの結合やグルーピングでCPU負荷となっているケースで、結合負荷、およびグルーピングによる負荷軽減による性能改善を狙う場合に利用
UNNEST(NO_UNNEST) IN句の副問合せ、EXISTS句の相関副問合せ(集計などGROUP BYの無いもの)、スカラー副問合せのネストを解除し結合への書き換えを指示(書き換えないよう指示)
パラレル
関連
PARALLEL
(NO_PARALLEL)
指定された並列度で実行するよう指示(シリアルで実行するよう指示)。文レベルのPARALLELヒントがオブジェクトレベルのPARALLELヒントより優先される。ソート操作またはグループ操作も実行する場合は指定された並列度の倍になる。
PQ_FILTER 相関副問合せフィルタリング時の行の処理方法(分散処理するかどうか、分散方法)についてオプティマイザに指示
PARALLEL_INDEX
(NO_PARALLEL_INDEX)
オブジェクトレベルのヒント。パーティション索引の索引レンジ・スキャン、全体スキャンおよび高速全体スキャンのパラレル化を指示
PQ_CONCURRENT_UNION
(NO_PQ_CONCURRENT_UNION)
UNION操作とUNION ALL操作の並列処理を有効にするようオプティマイザに指示。(シリアル処理するよう指示)
PQ_DISTRIBUTE プロデューサおよびコンシューマ問合せサーバーに行を分散させる方法をオプティマイザに指示
PQ_SKEW
(NO_PQ_SKEW)
パラレル結合の結合キーの値の分散が著しく偏っている(つまり、同じ結合キー値を持つ行の割合が大きい)ことをオプティマイザに知らせる。(偏りがないことを知らせる)ハイブリッドハッシュ時で分散させる場合に利用できるヒント
その他 APPENDヒント
APPEND_VALUE(NOAPPEND)
INSERT AS SELECTでダイレクトパスインサートを指示/INSERT VALUES文でダイレクトパスインサートを指示(ダイレクトパスインサートしないように指示)
DYNAMIC_SAMPLING 動的統計のサンプリングを方法をオプティマイザに指示
OPT_PARAM OPTIMIZER_DYNAMIC_SAMPLING、OPTIMIZER_INDEX_CACHING、OPTIMIZER_INDEX_COST_ADJ、OPTIMIZER_SECURE_VIEW_MERGINGおよびSTAR_TRANSFORMATION_ENABLEなど、いくつかの初期化パラメータと隠しパラメータを制御
DRIVING_SITE データベースリンクで結合された分散データベース環境において利用するヒント。SQL文を駆動するデータベースをオプティマイザに指示
PUSH_PRED
(NO_PUSH_PRED)
結合述語をビューにプッシュするようオプティマイザに指示(プッシュしないようオプティマイザに指示)
PUSH_SUBQ
(NO_PUSH_SUBQ)
実行計画の初期段階でマージされていない副問合せを評価するようオプティマイザに指示(副問合せの評価を最後に行うよう指示)。マージされていない副問合せは、実行計画の最終に実行される。副問合せのコストが比較的低く、副問合せによって行数が大幅に減少する場合、副問合せの早期評価によってパフォーマンス が向上が期待できる
QB_NAME 問合せブロックの名前を定義。通常内部的な名称を自動的に付与するが、それに替えてユーザが扱いやすい名前を定義することができる。グローバルヒント構文で使用するために定義することが一般的。

Oracle データベース アーキテクチャ(Space Management Coordinator Process (SMCO))

f:id:undercovergeek:20200806213218p:plain

SMCO

スペース管理コーディネータープロセス(SMCO)は、事前のスペース割り当てやスペースの再利用など、さまざまなスペース管理タスクの実行をスケジュールするバックグラウンドプロセス。
SMCOは動的にスペース管理スレーブプロセス(Wnnn)を生成して、これらのタスクを実装する。
インメモリコーディネータープロセス(IMCO)は、バックグラウンドの作成と列データの再作成を開始するバックグラウンドプロセスであることに注意。

Wnnnスレーブプロセスは、スペース管理に代わって、およびOracle In-Memoryオプションに代わって作業を実行する。

・Wnnnプロセスは、バックグラウンドでスペース管理タスクを実行するためにSMCOによって動的に生成されるスレーブプロセス。  
これらのタスクには、スペース使用量の増加分析に基づいてローカルに管理されたテーブルスペースとSecureFilesセグメントにスペースを事前に割り当てること、およびドロップされたセグメントからスペースを再利用することが含まれる。  
タスクには、高速取り込みの据え置き挿入も含まれる。  
起動後、スレーブは自律エージェントとして機能する。  
タスクの実行が完了すると、自動的にキューから別のタスクを取得する。  
長時間アイドル状態になった後、プロセスは終了する。

 ・Wnnnプロセスは、メモリ内の有効なオブジェクトにデータを入力および再入力する。  
 インメモリコーディネータープロセス(IMCO)は、バックグラウンド入力と列データの再入力を開始する。  
 IMCOバックグラウンドプロセスとフォアグラウンドプロセスは、人口と再人口にWnnnスレーブを利用する。  
 IMCOはWnnnプロセスを使用して、優先度がLOW/MEDIUM/HIGH/CRITICALのメモリ内オブジェクトの事前入力、およびメモリ内オブジェクトの再入力を行う。  
 Wnnnスレーブで実行されているメモリ内のデータの追加と再作成のタスクも、メモリ内の有効なオブジェクトを参照するクエリとDMLに応答して、フォアグラウンドプロセスから開始される。  

SMCOとWnnnはどちらも、スレッドまたはオペレーティングシステムプロセスとして実行できる。

Oracle データベース アーキテクチャ(Flashback Data Archiver Process (FBDA))

f:id:undercovergeek:20200805195607p:plain

FBDA

フラッシュバックデータアーカイバープロセス(FBDA)は、テーブルの存続期間中のトランザクションの変更を追跡および保存する機能を提供するバックグラウンドプロセス。
このようにして、テーブルをフラッシュバックして元の状態に戻すことができる。

追跡対象のテーブルを変更するトランザクションがコミットすると、FBDAは生成された新しい取り消しをチェックし、アーカイブ対象としてマークされたオブジェクトに関連するものをフィルタリングし、取り消した情報をフラッシュバックデータアーカイブテーブルスペースにコピーする。
FBDAは現在の行のメタデータを維持し、アーカイブされたデータの量を追跡する。

FBDAは、スペース、編成(パーティション化テーブルスペース)、および保持のためのフラッシュバックデータアーカイブの自動管理も担当する。
また、FBDAは、追跡されたトランザクションのアーカイブがどこまで進行したかを追跡する。

FBDAは、スレッドまたはオペレーティングシステムプロセスとして実行できる。

Oracle データベース アーキテクチャ(Recovery Writer Process (RVWR))

f:id:undercovergeek:20200804200831p:plain

RVWR

リカバリライタープロセス(RVWR)は、データベース全体またはプラガブルデータベースをフラッシュバックするために使用されるバックグラウンドプロセス。
つまり、必要なフラッシュバックログがあれば、データベースの現在の状態から過去の時間までのトランザクションを取り消す。
フラッシュバックが有効な場合、または復元ポイントが保証されている場合、RVWRはフラッシュバックデータを高速リカバリ領域のフラッシュバックデータベースログに書き込む。

RVWRは、スレッドまたはオペレーティングシステムプロセスとして実行できる。

Oracle データベース アーキテクチャ(Job Queue Coordinator Process (CJQ0))

f:id:undercovergeek:20200803203845p:plain

CJQ0

ジョブキューコーディネータープロセス(CJQ0)は、データディクショナリから実行する必要があるジョブを選択し、ジョブキュースレーブプロセス(Jnnn)を起動してジョブを実行するバックグラウンドプロセス。
CJQ0は、Oracle Schedulerによって必要に応じて自動的に起動および停止される。
JOB_QUEUE_PROCESSES初期化パラメーターは、ジョブの実行用に作成できるプロセスの最大数を指定する。
CJQ0は、実行するジョブの数と使用可能なリソースに必要な数のジョブキュープロセスのみを開始する。

ジョブキュースレーブプロセス(Jnnn)は、ジョブコーディネーターによって割り当てられたジョブを実行する。
処理するジョブが選択されると、ジョブスレーブは次のことを行う。

 ・プログラムの引数や特権情報など、ジョブの実行に必要なすべてのメタデータを収集する
 ・ジョブの所有者としてデータベースセッションを開始し、トランザクションを開始してから、ジョブの実行を開始する
 ・ジョブが完了すると、スレーブはトランザクションをコミットして終了する
 ・セッションを閉じる

ジョブが完了すると、スレーブは次のことを行う。

 ・必要に応じてジョブを再スケジュールする
 ・ジョブテーブルの状態を更新して、ジョブが完了したか、再度実行するようにスケジュールされているかを反映する
 ・ジョブログテーブルにエントリを挿入する
 ・実行カウントを更新し、必要に応じて、失敗と再試行のカウントを更新する
 ・クリーンナップ
 ・新しい仕事を探る(ない場合は、スリープ状態になる)

CJQ0とJnnnはどちらも、スレッドまたはオペレーティングシステムプロセスとして実行できる。

Oracle データベース アーキテクチャ(Archiver Process (ARCn))

f:id:undercovergeek:20200802172209p:plain

ARCn

アーカイバプロセス(ARCn)は、データベースがARCHIVELOGモードであり、自動アーカイブが有効な場合にのみ存在するバックグラウンドプロセス。
この場合、ARCnはオンラインREDOログファイルを自動的にアーカイブする。
ログライタープロセス(LGWR)は、アーカイブされるまでオンラインREDOロググループを再利用および上書きできない。

一杯になったオンラインREDOログのアーカイブが遅れないようにするために、データベースは必要に応じて複数のアーカイバプロセスを開始する。
可能なプロセスには、ARC0〜ARC9およびARCa〜ARCt(31の可能な宛先)が含まれる。

LOG_ARCHIVE_MAX_PROCESSES初期化パラメータは、データベースが最初に呼び出すARCnプロセスの数を指定する。
データの一括読み込み中など、アーカイブの負荷が大きいことが予想される場合は、アーカイバープロセスの最大数を増やすことができる。
複数のアーカイブログの宛先が存在する場合もある。
宛先ごとに少なくとも1つのアーカイバープロセスがあることが推奨される。

ARCnは、スレッドまたはオペレーティングシステムプロセスとして実行できる。

Oracle データベース アーキテクチャ(Log Writer Process (LGWR))

f:id:undercovergeek:20200730201358p:plain

LGWR

ログライタープロセス(LGWR)は、REDOログエントリをREDOログファイルに順次書き込むバックグラウンドプロセス。
REDOログエントリは、システムグローバルエリア(SGA)のREDOログバッファに生成される。
データベースに多重化REDOログがある場合、LGWRは同じREDOログ・エントリをREDOログ・ファイル・グループのすべてのメンバーに書き込む。

LGWRは、非常に高速な操作、または調整が必要な操作を処理し、操作をログライターワーカーヘルパープロセス(LGnn)に委託する。
この操作は、主にログバッファーからREDOログファイルにREDOを書き込み、 待機中のフォアグラウンドプロセスへの書き込みが完了させる。

REDO転送スレーブ・プロセス(TT00-zz)は、現在のオンラインおよびスタンバイREDOログから、非同期(ASYNC)REDO転送用に構成されたリモート・スタンバイ宛先にREDOを送信する。

LGWRは、スレッドまたはオペレーティングシステムプロセスとして実行できる。
データベースインスタンスに加えて、LGWRはOracle ASMインスタンスでも実行される。
Oracle Real Application Clusters(RAC)構成の各データベースインスタンスには、独自のREDOログファイルのセットがある。

スポンサーリンク