2

何千回も呼び出されるストアド プロシージャの一部があり、その結果、全体の大部分を占めています。実行計画を実行すると、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 への挿入の実行計画は次のとおりです。 実行計画 1

インサートとスプールの内訳: 内訳

次に、top4 と orderby を選択するための実行計画: 実行計画2

さらに情報や内訳が必要な場合はお知らせください。#Mytemptable のサイズは通常 28000 行で、インデックスがあります。

CREATE INDEX MyIndex on #MyTempTable (Param1, Param2) INCLUDE ([SomeField])
4

1 に答える 1