0

重複の可能性:
実行プランに、永続化される計算列のユーザー定義関数呼び出しが含まれているのはなぜですか?

永続化された計算列をテーブルに追加しました。

ALTER TABLE guest
  ADD FullName AS
  dbo.complicatedFunction(ISNULL(FirstName, N'') + ISNULL(LastName, '')) PERSISTED
GO

また、そのフィールドに非クラスター化インデックスを追加しました。

そのテーブルから選択を実行し、その列をwhereステートメントに含めると、実行に非常に時間がかかります。

永続化された列を式に直接置き換えてみましたが、実行に同じ時間がかかるため、そのテーブルから何かを選択しようとすると、すべての行に対してFullNameフィールドが再計算されていると思いました。

どうすればその再計算を回避し、クエリでインデックスを使用できるようになりますか?

実行計画

4

2 に答える 2

0

その理由は、クエリ オプティマイザーがユーザー定義関数のコストをあまり適切に処理できないためです。場合によっては、行ごとに関数を完全に再評価する方が、別の方法で必要になる可能性のあるディスク読み取りを発生させるよりも安価であると判断します。

実行プランに、永続化された計算列に対するユーザー定義の関数呼び出しが含まれているのはなぜですか?

于 2012-07-01T21:03:09.660 に答える
0

Martin Smith は、なぜこれが起こっているのかについての素晴らしい説明へのリンクを投稿しました。それを読んだ後、UDF への呼び出しを本体に置き換えて、問題を解決しました。

于 2012-07-02T07:51:25.423 に答える