Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » クエリ処理 » クエリの最適化と実行 » セマンティック・クエリ変形

 

ユーザ定義関数のインライン化

単純なユーザ定義関数は、クエリの一部として呼び出されたときにインライン化されることがあります。つまり、元のクエリと同等で、関数定義のないクエリに書き換えられます。テンポラリ関数、再帰関数、NOT DETERMINISTIC 句のある関数はインライン化されません。また、関数がサブクエリを使用して引数として呼び出された場合、または関数がテンポラリ・プロシージャの内部から呼び出された場合は、インライン化されません。

次のいずれかの形式の場合、ユーザ定義関数をインライン化できます。

  • 1 つの RETURN 文を伴う関数。次に例を示します。

    CREATE FUNCTION F1( arg1 INT, arg2 INT )
    RETURNS INT
    BEGIN
     RETURN arg1 * arg2
    END;
  • 1 つの変数を宣言し、その変数に代入して 1 つの値を返す関数。次に例を示します。

    CREATE FUNCTION F2( arg1 INT )
    RETURNS INT
    BEGIN
     DECLARE result INT;
     SET result = ( SELECT ManagerID FROM Employees WHERE EmployeeID=arg1 );
     RETURN result;
    END;
  • 1 つの変数を宣言し、その変数に SELECT INTO して 1 つの値を返す関数。次に例を示します。

    CREATE FUNCTION F3( arg1 INT )
    RETURNS INT
    BEGIN
     DECLARE result INT;
     SELECT ManagerID INTO result FROM Employees e1 WHERE EmployeeID=arg1;
     RETURN result;
    END;
    

ユーザ定義関数の本文のコピー、呼び出しからの引数の挿入、適切な CAST 関数の挿入によってユーザ定義関数はインライン化され、書き換えられたクエリは元のクエリと同等になります。たとえば、定義済みの関数 F1 と同様の関数を作成し、次のようにクエリの FROM 句でプロシージャを呼び出すとします。

SELECT F1( e.EmployeeID, 2.5 ) FROM Employees e;

データベース・サーバは、次のようにクエリを書き換える場合があります。

SELECT CAST( e.EmployeeID AS INT ) * CAST( 2.5 AS INT ) FROM Employees e;
参照