何千回も呼び出されるストアド プロシージャの一部があり、その結果、全体の大部分を占めています。実行計画を実行すると、TOP 4 と Order By の部分がその多くを占めているように見えます。order by は、合理化されていますが、まだかなり使用されている関数を使用します。
これは、データの 99.5% に対して 4 つ以下の結果が返されるという奇妙な状況です。TOP 4 が必要なのは 0.5% の時間だけです。これはデータ アルゴリズムの要件であるため、TOP を排除します。 4 完全にオプションではありません。
だから私の構文は
SELECT SomeField * SomeOtherField as MainField, SomeOtherField
FROM
(
SELECT TOP 4
SomeField, 1/dbo.[Myfunction](Param1, Param2, 34892) as SomeOtherField
FROM #MytempTable
WHERE
Param1 > @NextMargin1 AND Param1 < @NextMargin1End
AND Param2 > @NextMargin2 AND Param2 < @NextMargin2End
ORDER BY dbo.[MyFunction](Param1, Param2, 34892)
) d
where が実行された後に 4 つ以上の結果が返された場合にのみ、SQL サーバーに注文を行うように指示する方法はありますか? そうでなければ注文は必要ありません。おそらく、テーブル変数と if 内のテーブルの数ですか?
--- Davids Answer に基づいて更新し、なぜ遅くなったのかを突き止めてください:
私がチェックしたところ、96.5% の確率で結果が 4 つ以下であることを確認できたので、予想よりも多くのデータがあるわけではありません。
@FunctionResults への挿入の実行計画は次のとおりです。
インサートとスプールの内訳:
次に、top4 と orderby を選択するための実行計画:
さらに情報や内訳が必要な場合はお知らせください。#Mytemptable のサイズは通常 28000 行で、インデックスがあります。
CREATE INDEX MyIndex on #MyTempTable (Param1, Param2) INCLUDE ([SomeField])