2012-05-03 1 views
1

ORACLEデータベースの中で最も高速なものは何ですか?SQLクエリを最適化する:関数を呼び出すか、結合を行うか?

コール簡単な関数で、各行

SELECT field1, field2, F_GET_LIBELLE_STATUT(field2) FROM table1 WHERE ... 

のための単一の値をretriveするselect文の内部機能:

create or replace 
FUNCTION "F_GET_LIBELLE_STATUT" (v_statut NUMBER) RETURN VARCHAR2 IS 
tmpVar VARCHAR2(40); 
BEGIN 
    select libelle into tmpVar from t_statut_ope where id_statut = v_statut; 
    RETURN tmpVar; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RETURN ''; 
    WHEN OTHERS THEN 
     -- Consider logging the error and then re-raise 
     RAISE; 
END f_get_libelle_statut; 

またはSELECT文の参加をしていますか?

selectと節の条件でたくさんの関数(10個以上)を呼び出すと同じ答えですか?

ご回答ありがとうございます。

+2

を平野が参加をアウトパフォームしますそれはそれがいつも意味するものではありません。常にソリューションの実行計画を見て、そこからあなたの結論を引き出すべきです。 –

+0

@Lieven - 私は、それぞれの場合をそのメリットで扱う必要性に同意します。しかし、ジョインは、ここに掲示された種類のルックアップ機能よりも常に速くなります。それは公理です。 – APC

+0

@APC - 私は同意する傾向がありますが、私は常に*や*決して*のような絶対的なステートメントについては注意しています。 –

答えて

6

SQLで実行できるものはすべてSQLで行う必要があります。セットベースの操作は行を有効にすることによって常に行より速くなるため、結合は常にその関数を呼び出すよりも高速になります。次に、SQLとPL/SQL間のコンテキスト・スイッチのオーバーヘッドが発生します。ギャップが予想され許容されているため、実際には例外ではないNO_DATA_FOUND例外を処理するオーバーヘッドもプラスになります。最後に、オプティマイザは、必要なすべての情報を指定したので、純粋なSQLオプションのより良い計画を選択します。

+0

時には、選択されたサブクエリが速くなり、結合されます。テストが必要です。 –

1

あなたはこれら2つの異なるクエリを使用して自分自身を見つけましたか?

私の経験では、ジョインは関数よりも10倍の速度で9倍です。少なくとも、関数内の別のクエリ/テーブル/ビューにアクセスしているとき。関数は実行ごとに評価する必要がありますが、ジョインはおそらくより大きなデータセットを生成しますが、かなり高速なテーブル(キー上)に加わるだけでよいため、パフォーマンスが向上します。

+0

私が取り組んでいる既存のアプリケーションで最初のクエリ(関数付き)が見つかりました。 2番目のクエリは私が一般的に行うよりも、結合ですべてのクエリを書き直す前に、私は魔法の方が効率的であることを知ろうとします。 – fluminis

2

関数メソッドが最適となる状況は非常に少なく、デフォルトでは使用しません。結合は、データベースが行うように設計されているものなので、最初に選択する必要があります。

0

OR外忘れる[これは外部結合することを時々高速である]選択リストで翻訳を行い、SELECTステートメントに参加して置く:、この特定のシナリオでは

SELECT field1, field2 
, (select libelle from t_statut_ope b where b.id_statut = a.field2) libelle 
FROM table1 a 
WHERE 1=1 
; 
+0

中断していますか、いつか速いのはなぜですか? – fluminis

+0

私は "選択リストのselect文"が "outer-join"よりも遅いとは思っていませんでした。私は、欠落しているレコードを「作成」するためにOracleが必要とする余分な作業が、外部結合の速度低下を引き起こすと考えています。この作業は、いずれかの側の非常に大きなテーブルの場合に増加します。 –

関連する問題