2

スカラー関数を使用するクエリがあります。唯一の関数パラメーターの値は、クエリのフィールドから取得されます (このように):

SELECT
    fn_MyFunc(MyField)
FROM MyTable

このテーブルに数千の行があり、 にいくつかの個別の値しかない場合MyField、オプティマイザーはその値を以前に見たことがあることを認識できるほどスマートでしょうか?それとも関数を何度も何度も実行するでしょうか?

4

2 に答える 2

2

ユーザー定義関数は、実行計画のみを格納します。この有用な情報をキャッシュできるオプティマイザーは存在しません。スカラー udf はブラック ボックスです。オプティマイザーは、UDF を手動でメモ化しません。

関数が決定論的である場合にパフォーマンスを向上させるソリューションは、時間とデータベースに関係なく、同じ入力が同じ出力を返すことを意味します。

この UDF のすべての可能な結果のテーブルを作成し、このテーブルをクエリで結合します。最高のパフォーマンスを発揮します/

于 2012-06-02T17:36:10.623 に答える
1

簡単な答えはノーです。十分にスマートではありません。はい、呼び出された回数だけ関数を実行します。

派生テーブルを使用して個別の値を作成できる場合は、パフォーマンスが向上する可能性があります。

SELECT fn_MyFunc(distinct_field) 
FROM (
    SELECT
        DISTINCT MyField as distinct_field
     FROM MyTable) tbl

また、関数のコードをアンラップしてクエリに埋め込むと役立つ場合があります。

于 2012-06-02T17:49:09.373 に答える