フェンス付きとフェンスなしのストアドプロシージャの背後にある理由を理解していると思います。
ポインターなどの問題が発生した場合にデータベースエンジンが破損する可能性を防ぐために、データベース(この場合はDB2)の "外側"でフェンスされた実行。
Unfencedはデータベースの「内部」で実行されるため、パフォーマンスが向上します。
SQL PLはSQLであるため、プログラミング言語のようにメモリにアクセスできないため、私が調査したことからも、SQL PLは常に基本的にはフェンスされていません。
C/C++およびJavaプロシージャは、fencedまたはunfencedで実行できます。ただし、それらはメモリにアクセスする可能性があるため、コードの品質が確実でない限り、fencedを実行することを検討する必要があります。クラッシュしないようにするには、パフォーマンスが必要です。
まず第一に、私は上記の理解で正しいですか?
次に、一般に、すべてのストアドプロシージャ(SQL PLとして定義されているものも含む)を最初にフェンスされた状態で開始することがベストプラクティスですか?
特にフェンシングやセキュリティに関連するストアドプロシージャの他のベストプラクティスはありますか?
編集:さらなる調査により、SQL PLプロシージャはフェンスで実行できないことがわかりました。ポインターやファイルI/Oなどのデータベースエンジンに害を及ぼす可能性のあるコードが含まれていないため、DB2はそれらが安全であると認識し、エンジン内で実行します(つまり、フェンスされていません)。そうは言っても、他のすべてのストアドプロシージャに関するベストプラクティスを探しています。
より正確には、NOT FENCEDルーチンは、データベースマネージャー自体と同じプロセス空間で実行されます。エンジンはCで記述されているため、fencedされていないルーチンの呼び出しは、main()から別のC関数を呼び出すのと同じです。これは、すべてのメモリ破損とパフォーマンスの側面が原因です。非隔離ルーチンは、データベースマネージャープロセス自体と同じリソース(メモリ、ファイルなど)にすべてアクセスできます。
FENCEDルーチンの場合、データベースマネージャーは別のプロセス(db2fmp)を起動し、次にルーチンコードを実行します。その結果、オペレーティングシステムの保護により、fencedルーチンがデータベースマネージャーに属するメモリ領域またはリソースにアクセスできなくなります。
SQLルーチンはfencedすることはできません。厳密に言えば、「実行」しないためですが、notfencedよりも優れています。 -それらはDB2ランタイムエンジン自体が実行するバイトコードであるため、個別のスレッドやプロセスはありません。
CおよびC++ルーチンは、隔離することができます。その場合、それらは別々のプロセスで実行されます。隔離しない場合は、データベースマネージャーのプロセススペースにロードされ、関数として呼び出されます。
Javaルーチンは、実行するために別のプロセスJava仮想マシン)が必要であるという事実によってのみフェンスできます。NOTFENCEDとして宣言すると、オプションは静かに無視されます。
とはいえ、fencedを使用するか、fencedを使用しないかは、C/C++ルーチンでのみ選択できます。通常、安全のためにfencedを実行し、データベースマネージャーに害を及ぼさないことが確実である場合にのみ非fencedモードに変更しますandより高いパフォーマンスが必要です。
私が知る限り、あなたはほとんど正しいです。重要なのは、PL SQL関数はメモリ割り当てを行うことができないため、メモリ管理に関してそれらを特別に扱う方法は実際にはないということです。本質的に、PL/SQLはdbエンジンにかなり密接に関連していますが、メモリ管理は、ストアドプロシージャではなく、dbエンジンの責任です。
一般に、私の推奨事項は、高性能システムでの使用を目的とした非常に優れた実績を持つ広範囲にテストおよび/またはレビューされたコードに対するものです。ただし、データベースは重要であり、バッファオーバーランのようなものは、しばらくの間検出されないデータ破損を引き起こす可能性があります。私が推奨するのは、特に必要がない限り、すべてのC/C++/Javaストアドプロシージャをフェンスで実行することです。
もちろん、同じことがUDFにも当てはまります。