スカラー関数を使用するクエリがあります。唯一の関数パラメーターの値は、クエリのフィールドから取得されます (このように):
SELECT
fn_MyFunc(MyField)
FROM MyTable
このテーブルに数千の行があり、 にいくつかの個別の値しかない場合MyField
、オプティマイザーはその値を以前に見たことがあることを認識できるほどスマートでしょうか?それとも関数を何度も何度も実行するでしょうか?
スカラー関数を使用するクエリがあります。唯一の関数パラメーターの値は、クエリのフィールドから取得されます (このように):
SELECT
fn_MyFunc(MyField)
FROM MyTable
このテーブルに数千の行があり、 にいくつかの個別の値しかない場合MyField
、オプティマイザーはその値を以前に見たことがあることを認識できるほどスマートでしょうか?それとも関数を何度も何度も実行するでしょうか?
ユーザー定義関数は、実行計画のみを格納します。この有用な情報をキャッシュできるオプティマイザーは存在しません。スカラー udf はブラック ボックスです。オプティマイザーは、UDF を手動でメモ化しません。
関数が決定論的である場合にパフォーマンスを向上させるソリューションは、時間とデータベースに関係なく、同じ入力が同じ出力を返すことを意味します。
この UDF のすべての可能な結果のテーブルを作成し、このテーブルをクエリで結合します。最高のパフォーマンスを発揮します/
簡単な答えはノーです。十分にスマートではありません。はい、呼び出された回数だけ関数を実行します。
派生テーブルを使用して個別の値を作成できる場合は、パフォーマンスが向上する可能性があります。
SELECT fn_MyFunc(distinct_field)
FROM (
SELECT
DISTINCT MyField as distinct_field
FROM MyTable) tbl
また、関数のコードをアンラップしてクエリに埋め込むと役立つ場合があります。