0

テーブルEntityとContactの間に1:1の関係があります(これはオブジェクトの継承に対応します)。fn_match(id)はUDFであり、ブール値を返し、レコードがいくつかの特別な基準(関数内の追加クエリ)に一致する場合はtrueを返します。それはクエリです:

select *
from Entity a
inner join Contact b on a.id = b.id
where fn_match(a.i)

それはうまく機能しましたが、パフォーマンスを劇的に台無しにします。ロギングを追加しましたが、fn_match(id)=trueのエンティティ内のすべてのレコードに対してfn_matchが2回呼び出されたことがわかりました。関数ヘッダーに決定論を追加して修正することはできますが、テーブルのデータにアクセスするすべての関数/ストアドプロシージャは非決定論的であると考えていました。

この問題の正しい解決策は何ですか?

4

1 に答える 1

0

-の結果を格納するために一時テーブルを使用できますFROM Entity WHERE fn_match(i)が、おそらくパフォーマンスは向上しません。fn_match が 2 回呼び出されてパフォーマンスが低下する場合、Entity の各アイテムに対して 1 回だけ呼び出された場合、パフォーマンスはそれほど良くないように思われるため、関数を完全に再考することをお勧めします。

于 2010-08-30T17:33:40.967 に答える