在存储过程中使用表值参数列 -

时间:2011-08-05 10:53:22

标签: sql performance sql-server-2008 stored-procedures table-valued-parameters

我将带有2个字段(datetimevarchar(3))的TVP传递到存储过程中,并且我试图返回表格所在的所有表格行#39; s datetime列要么等于TVP日期之一,要么等到几分钟之前(我不介意重复,但不希望没有)。

这就是我想出的 - 它目前非常慢(约5秒!)而且我不知道如何改进它。索引表?哪一栏? AtTime

我知道这是一个繁琐的查询,因为它需要在尝试匹配行之前计算要查找的范围,所以如果有完全不同但更可取的方法,请告诉我。此外,输入TVP有大约300行,表格本身超过200k,因此需要匹配和搜索大量数据。

CREATE PROCEDURE [dbo].[spGetPricesForDates]
    @tvp tvpType READONLY
AS
BEGIN
    SET NOCOUNT ON;

    SELECT S.AtTime, S.Underlying, S.Price
    FROM SourceTable S, @tvp T
    WHERE S.Underlying = T.Underlying   
    AND S.AtTime in (select AtTime
                    from SourceTable 
                    where AtTime 
                    between DATEADD(mi, -2, T.MyDate)
                    and T.MyDate)
END

修改我刚刚意识到我的in查询无法做我想做的事情 - 我想要返回最新 在2分钟范围内匹配每个tvp行的表格日期/价格行,而目前它会给我between集合中匹配的所有内容。我尝试使用MAX(AtTime),但这限制了一个可能的匹配,所以我回到了正方形1.

1 个答案:

答案 0 :(得分:3)

尝试使用此inner join

SELECT S.AtTime, S.Underlying, S.Price
FROM SourceTable S
INNER JOIN @tvp T ON (S.Underlying = T.Underlying 
        AND (S.AtTime BETWEEN DATEADD(mi, -2, T.MyDate) AND T.MyDate))