4

SQL クエリでの関数の使用について質問があります。

テーブルからユーザー名を取得するための次の関数があります

CREATE OR REPLACE
  FUNCTION get_info(
      p_emp_no employees.emp_id%TYPE)
    RETURN VARCHAR2
  AS
    o_userid employees.emp_name%TYPE;
  BEGIN
    SELECT emp_name INTO o_userid FROM employees WHERE emp_id = p_emp_no;
    RETURN o_userid;
  END;
  /

SQLコードで上記の関数を次のように使用すると

select product_no, get_info(p.raised_by)
from products p, employees e
where p.raised_by  = e.emp_no

実行は以下のSQLよりも時間がかかります

select product_no, e.emp_name
from products p, employees e
where p.raised_by  = e.emp_no

2 番目のクエリは、最初のクエリよりも高速です。

関数を使用してテーブルからユーザー名を取得するか、直接列名を使用し、結合を使用して従業員テーブルにリンクすることをお勧めしますか?

私が尋ねた理由は、raised_by、created_by、modified_byなどのユーザー名を取得するために employees テーブルへの複数の参照がある可能性があるためです。

これに関する洞察は非常に高く評価されます。

ありがとう

4

1 に答える 1

4

結合を使用する方法です。この関数を使用すると、各行の結果に対して個別のインデックス ルックアップを使用して個別のクエリがトリガーされ、結果が大幅に遅くなります。

複数の結合を避けたいというあなたの希望は理解していますが、あなたの例では、3 つの関数呼び出しよりも 3 つの結合の方が優れています。

このように考えてください。関数は独自の結合を行っています

WHERE emp_id = p_emp_no

そして、それは一度だけではなく、すべての単一の行に対して個別に結合しています!

于 2012-12-18T05:47:58.373 に答える