ユーザー定義関数の使用

書き込み SQL アプリケーションで、いくつかのアクションまたは操作をユーザー定義関数 (UDF) として、またはアプリケーションのサブルーチンとしてインプリメントすることができます。新規操作をサブルーチンとしてインプリメントする方がより簡単に見える場合がありますが、代わりに UDF を使用する利点についても考慮することができます。

例えば、新しい操作が、他のユーザーまたはプログラムが利用できるようなものである場合には、 UDF を使用することにより、その再利用が可能になります。 さらに、式を使用することができる場合には、この関数は SQL から直接呼び出すことができます。 データベースは、この関数の引数の各種のデータ・タイプのプロモーションを自動的に管理することができます。 例えば、DECIMAL から DOUBLE を使用すると、データベースは、異なるが互換性のあるデータ・タイプに関数を使用することが可能になります。

あるケースでは、UDF をデータベース・エンジンから (アプリケーションからではなく) 直接呼び出すと、パフォーマンスがかなり向上する場合があります。 この利点は、さらに処理を行うためのデータの修飾に関数を使用できる場合に得られます。 このようなケースは、関数が行選択処理に使用されるときに発生します。

あるデータを処理する単純なシナリオを考えてみます。関数 SELECTION_CRITERIA() として表されるある選択基準に適合しているとします。アプリケーションで、以下の選択ステートメントを出します。

     SELECT A, B, C FROM T

それぞれの行を受け取ると、プログラムの SELECTION_CRITERIA 関数がデータに対して実行 され、データをさらに処理する必要があるかどうかが決められます。このステートメントでは、表 T の各行がアプリケーションに戻されなければなりません。 しかし、SELECTION_CRITERIA() が UDF として設定された場合は、アプリケーションで次のステートメントを出すことができます。

     SELECT C FROM T WHERE SELECTION_CRITERIA(A,B)=1

このケースでは、必要な行と 1 つの列だけが、アプリケーションとデータベースとの間のインターフェースで 受け渡しされます。

UDF によってパフォーマンスの利点が得られるもう 1 つのケースは、ラージ・オブジェクト (LOB) を処理する場合です。LOB の値からある情報を抜き出す関数があるとします。 この抽出作業を直接データベース・サーバーで実行して、抽出された値だけをアプリケーションに戻すことができます。 これは、LOB 値全体をアプリケーションに戻し、それから抽出を行うよりも、はるかに効率のよい方法です。 この関数を UDF としてパッケージすることから得られるパフォーマンス上の価値は、特定の状態によっては、非常に大きなものがあります。