【发布时间】:2014-08-22 21:05:52
【问题描述】:
我有一个包含大约 940 行的表格。我正在创建一个需要解决以下问题的专门计算:
对于每一行,我可以将 A 乘以多少次而不超过 B。
我创建了一个 UDF 来执行此操作,如下所示:
DECLARE @x int;
DECLARE @Result decimal(18,4);
DECLARE @CutOff int;
SELECT @x=0, @CutOff=1000, @Result=null;
WHILE (((@Result < @tVal) or (@Result IS NULL)) AND @x < @CutOff) BEGIN
SET @x = @x + 1;
SET @Result = @hProb * @x;
END
IF (@x = @CutOff)
SET @x = -1;
RETURN @x;
@tVal 是我们希望达到的目标值。
@CutOff 是要乘以的最大数,如果 x 达到此数但仍未超过目标值,则停止循环并返回负数
这可行,但我的 SP 通常需要大约 20 秒才能运行,当我添加此功能时,它会增加大约 6.5 分钟的处理时间。
如果可能的话,我想要一种更有效的方法来做到这一点,但到目前为止我找不到更好的解决方案。
感谢所有帮助。
【问题讨论】:
-
我猜想有一个数学解决方案 - 使用 log 函数。在 UDF 中有一个循环是导致您的问题的原因!
-
为什么不直接使用
@Cutoff / @hProb之类的东西? -
这个问题似乎是题外话,因为它需要一个代码审查。试试 codereview.stackexchange.com
-
声明
(@Result < @tVal)中的@tVal是什么?应该是@CutOff 吗?正如 Kieren 所说,循环 100% 是你的问题,所以如果有人有创造性的方法来解决它而不用循环,那么你就是黄金。
标签: sql-server tsql optimization algebra