テーブル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回呼び出されたことがわかりました。関数ヘッダーに決定論を追加して修正することはできますが、テーブルのデータにアクセスするすべての関数/ストアドプロシージャは非決定論的であると考えていました。
この問題の正しい解決策は何ですか?