システム固有の実行のためのPL/SQLユニットのコンパイル
通常、PL/SQLユニットをコンパイルして、システム固有のコード(プロセッサに依存するシステム・コード)にすると、PL/SQLユニットをスピードアップできます。システム固有のコードは、SYSTEM表領域に格納されます。
Oracle Databaseが提供するユニットを含め、すべてのタイプのPL/SQLユニットをネイティブ・コンパイルできます。
ネイティブ・コンパイルされたプログラム・ユニットは、共有サーバー構成(以前のマルチスレッド・サーバー)やOracle Real Application Clusters(Oracle RAC)などのすべてのサーバー環境で動作します。
ほとんどのプラットフォームで、PL/SQLネイティブ・コンパイルに特別な設定またはメンテナンスは必要ありません。一部のプラットフォームでは、DBAによるオプションの構成が必要な場合もあります。
関連項目:
-
データベースの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
-
ご使用のプラットフォームの詳細は、プラットフォーム固有の構成ドキュメントを参照してください。
PL/SQLのネイティブ・コンパイルを有効にしてパフォーマンスが改善される度合いは、テストによって確認できます。
PL/SQLのネイティブ・コンパイルを使用するとデータベース操作で大幅にパフォーマンスが改善されると判断した場合、ネイティブ・モードでデータベース全体をコンパイルすることをお薦めします(これを行うには、DBA権限が必要です)。これによって、独自のコードと、Oracle Database提供のPL/SQLパッケージへのコールの両方がスピードアップします。
ここでのトピック
PL/SQLのネイティブ・コンパイルを使用するかどうかの判断
PL/SQLユニットをネイティブ・モードでコンパイルするか、解釈済モードでコンパイルするかは、開発サイクルの段階およびプログラム・ユニットの内容によって決まります。
プログラム・ユニットをデバッグし、頻繁に再コンパイルしている場合は、解釈済モードに次のメリットがあります。
-
(ネイティブ・モードでコンパイルされたプログラム・ユニットではなく)解釈済モードでコンパイルされたプログラム・ユニットに対しては、PL/SQLデバッグ・ツールを使用できます。
-
解釈済モードのコンパイルは、ネイティブ・モードでのコンパイルより高速です。
開発のデバッグ・フェーズ後、ネイティブ・モードでPL/SQLユニットをコンパイルするかどうかを判断する際は次のことを考慮してください。
-
PL/SQLのネイティブ・コンパイルによって、計算集中型のプロシージャ操作のパフォーマンスは大幅に改善されます。この例には、データ・ウェアハウス・アプリケーションや、サーバー側でデータを大幅に変換して表示するアプリケーションなどがあります。
-
PL/SQLのネイティブ・コンパイルによって、SQLの実行にほとんどの時間を費やすPL/SQLサブプログラムのパフォーマンスはほとんど改善されません。
-
多数のプログラム・ユニット(通常は15,000以上)をシステム固有の実行用にコンパイルし、同時にアクティブにすると、大量の共有メモリーが必要になるため、システムのパフォーマンスに影響することがあります。
PL/SQLのネイティブ・コンパイルの動作
ネイティブ・コンパイルを使用しない場合、PL/SQLユニットのPL/SQL文は、中間形式のシステム・コードにコンパイルされます。このコードは、カタログに格納され、実行時に解釈されます。
PL/SQLのネイティブ・コンパイルを使用する場合、PL/SQLユニットのPL/SQL文はシステム固有のコードにコンパイルされ、カタログに格納されます。システム固有のコードは、実行時に解釈する必要がないため、高速で実行されます。
ネイティブ・コンパイルはPL/SQL文にのみ適用されるため、SQL文のみを使用するPL/SQLユニットの場合、ネイティブ・コンパイルしても高速に実行されない可能性がありますが、対応する解釈済コードより低速になることはありません。コンパイルされたコードと解釈済コードは同じライブラリをコールするため、アクションは同じです。
ネイティブ・コンパイルされたPL/SQLユニットを初めて実行すると、このユニットは、SYSTEM表領域から共有メモリーにフェッチされます。プログラム・ユニットを起動するセッションの数に関係なく、共有メモリーにはそのコピーが1つのみ含まれています。プログラム・ユニットが使用されていない場合、そのプログラム・ユニットが使用している共有メモリーを解放してメモリー・ロードを軽減できます。
ネイティブ・コンパイルされたサブプログラムと解釈済サブプログラムは相互に起動し合うことができます。
PL/SQLのネイティブ・コンパイルは、Oracle Real Application Clusters(Oracle RAC)環境では透過的に動作します。
PLSQL_CODE_TYPE
コンパイル・パラメータによって、PL/SQLコードをネイティブ・コンパイルするか解釈済にするかが決まります。このコンパイル・パラメータの詳細は、「PL/SQLユニットおよびコンパイル・パラメータ」を参照してください。
依存性、無効化および再評価
無効化したPL/SQLモジュールでは、再コンパイルが自動的に行われます。たとえば、ネイティブ・コンパイルされたPL/SQLサブプログラムが依存するオブジェクトが変更されると、サブプログラムは無効になります。同じサブプログラムが次にコールされたとき、データベースはサブプログラムを自動的に再コンパイルします。PLSQL_CODE_TYPE
設定はサブプログラムごとにライブラリ・ユニットに格納されるため、自動再コンパイルではこの格納された設定をコード型として使用します。
明示的な再コンパイルで、格納されているPLSQL_CODE_TYPE
設定が使用されるとはかぎりません。格納されている設定を明示的な再コンパイルで使用する条件は、「PL/SQLユニットおよびコンパイル・パラメータ」を参照してください。
PL/SQLのネイティブ・コンパイルで使用する新しいデータベースの設定
DBA権限を持っている場合、コンパイル・パラメータPLSQL_CODE_TYPE
をNATIVE
に設定して、PL/SQLネイティブ・コンパイル用に新しいデータベースを設定できます。多くのデータベース操作で使用されるOracle Database提供のPL/SQLパッケージで、パフォーマンスが改善します。
ノート:
データベース全体をNATIVE
でコンパイルする場合は、システム・レベルでPLSQL_CODE_TYPE
を設定することをお薦めします。
PL/SQLネイティブ・コンパイルまたは解釈コンパイルで使用するデータベース全体のコンパイル
DBA権限を持っている場合、この項で説明するプロセスで、dbmsupgnv
.sqlおよび
dbmsupgin
.sqlのスクリプトを使用して、既存のデータベースのすべてのPL/SQLモジュールをそれぞれNATIVE
またはINTERPRETED
に再コンパイルできます。この変換を実行する前に、「PL/SQLのネイティブ・コンパイルを使用するかどうかの判断」の内容に目を通してください。
ノート:
-
データベース全体を
NATIVE
でコンパイルする場合は、システム・レベルでPLSQL_CODE_TYPE
を設定することをお薦めします。 -
Database Vaultが有効で、Database Vaultの管理者から
DV_PATCH_ADMIN
ロールを付与された場合にのみ、dbmsupgnv
.sql
を実行できます。 -
ここで説明する変換プロセスは、現在のコンテナのユニットにのみ影響します。他のコンテナのユニットは影響を受けません。
ネイティブ・コンパイルへの変換で、dbmsupgnv
.sql
によってTYPE
仕様部をNATIVE
に再コンパイルすることはできません。これらの仕様部には実行可能なコードが含まれていないためです。
パッケージ仕様部に実行可能なコードが含まれることはほとんどないため、NATIVE
にコンパイルしても実行時の利点は得られません。dbmsupgnv
.sql
スクリプトでTRUE
コマンドライン・パラメータを使用すると、NATIVE
への再コンパイルからパッケージ仕様部を除外して、変換処理にかかる時間を節約できます。
dbmsupgin
.sql
スクリプトで解釈コンパイルに変換するときは、パラメータは指定できず、PL/SQLユニットを除外することはできません。
ノート:
次の手順では、ネイティブ・コンパイルへの変換について説明します。すべてのPL/SQLモジュールを解釈コンパイルに再コンパイルする必要がある場合は、ステップを次のように変更してください。
-
1番目のステップをスキップします。
-
PLSQL_CODE_TYPE
コンパイル・パラメータをNATIVE
ではなくINTERPRETED
に設定します。 -
dbmsupgnv
.sql
スクリプトをdbmsupgin
.sql
スクリプトに置き換えます。