我有一个存储过程的一部分,它被调用了成千上万次,因此占据了整个过程的大部分。通过执行计划运行它后,看起来 TOP 4 和 Order By 部分占据了很多。order by 使用的功能虽然简化了,但仍会被使用。
这是一个奇怪的情况,因为对于 99.5% 的数据,无论如何都会返回 4 个或更少的结果,只有 0.5% 的时间我们需要 TOP 4。这是数据算法的要求,因此消除了 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
有没有一种方法可以告诉 SQL Server 当且仅当在 where 发生后返回超过 4 个结果时才进行排序?否则我不需要订单。也许是一个表变量和if中的表计数?
--- 基于 Davids Answer 的更新,试图找出它变慢的原因:
我做了检查,可以确认 96.5% 的时间有 4 个或更少的结果,所以这不是数据比预期更多的情况。
这是插入到@FunctionResults 的执行计划
以及插入和线轴的故障:
然后是top4和orderby的选择执行计划:
如果需要任何进一步的信息或细分,请告诉我,#Mytemptable 的大小通常为 28000 行并且它有索引
CREATE INDEX MyIndex on #MyTempTable (Param1, Param2) INCLUDE ([SomeField])