2

我在 Multi-Step Table 值函数中有如下所示的 sql。我将查询缩短了一点以使其易于理解。

CREATE FUNCTION [dbo].[fn_ph] 
(
    -- Add the parameters for the function here
    @pAsOfDate date,
    @pAccountId nvarchar(15)
)
RETURNS @HH TABLE 
(
    -- Add the column definitions for the TABLE variable here
    AsOfDate date,
    AccountId nvarchar(15), 
    LongName varchar(100),
    ShortName varchar(100)
)
AS

BEGIN

declare @longOrShortIndicator int
select @longOrShortIndicator = COUNT(distinct LongOrShortIndicator) from table1 a


select a.*,
 case 
    when a.SecType='CASH' and @longOrShortIndicator > 1 then 'C'
    else a.LongOrShortIndicator
 end as LongOrShortIndicator
from Table1 a

END

表达when a.SecType='CASH' and @longOrShortIndicator > 1 then 'C'是瓶颈。

如果我删除@longOrShortIndicator > 1查询运行速度快

如果我在函数之外运行查询,它会快速返回......

为什么局部变量会减慢整个查询的速度?任何帮助,将不胜感激。

谢谢

4

2 回答 2

1

该清单没有显示您想对返回表@HH 做什么,但在@longOrShortIndicator 中,您显然是在计算table1 中的行数。如果你做了很多次,例如对于你返回表的所有行,那么它确实很慢,即使在死星上也会很慢。

于 2012-04-30T21:49:57.920 回答
0

在这里猜测:也许您可以尝试将 @LongOrShortIndicator 变量从查询中移出并放入 IF 语句中:

declare @longOrShortIndicator int
select @longOrShortIndicator = COUNT(distinct LongOrShortIndicator) from table1 a

IF @longOrShortIndicator > 1 BEGIN
    select a.*,
        CASE when a.SecType='CASH' then 'C'
        else a.LongOrShortIndicator
        end as LongOrShortIndicator
    from Table1 a
END ELSE BEGIN
    select a.*, a.LongOrShortIndicator
    from Table1 a
END
于 2012-05-01T03:18:55.470 回答