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

Sql 在存储过程中使用表值参数的列-,sql,performance,sql-server-2008,stored-procedures,table-valued-parameters,Sql,Performance,Sql Server 2008,Stored Procedures,Table Valued Parameters,我将一个包含两个字段的TVP(日期时间和varchar3)传递到一个存储过程中,并尝试返回所有表行,其中表的datetime列要么等于TVP日期时间之一,要么最多提前几分钟。我不介意重复,但希望不重复 这就是我想到的-目前速度非常慢~5秒!我不知道该怎么做才能改善它。索引表格?哪个栏目?什么时候 我知道这是一个复杂的查询,因为在尝试匹配行之前需要计算要查找的范围,所以如果有完全不同但更可取的方法,请让我知道。加上输入TVP有约300行,表本身有超过200k,因此有大量数据需要匹配和搜索 CREA

我将一个包含两个字段的TVP(日期时间和varchar3)传递到一个存储过程中,并尝试返回所有表行,其中表的datetime列要么等于TVP日期时间之一,要么最多提前几分钟。我不介意重复,但希望不重复

这就是我想到的-目前速度非常慢~5秒!我不知道该怎么做才能改善它。索引表格?哪个栏目?什么时候

我知道这是一个复杂的查询,因为在尝试匹配行之前需要计算要查找的范围,所以如果有完全不同但更可取的方法,请让我知道。加上输入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行匹配表日期/价格行,而目前它将为我提供在这两组之间匹配的所有内容。我尝试使用MAXAtTime,但这将它限制为一个可能的匹配,因此我返回到第1步。

尝试使用此内部联接:

尝试使用此内部联接:


你会输入一些真实的数据吗?你会输入一些真实的数据吗?我已经测试过了,它确实给出了从2分钟到通过日期的范围内的值。这看起来很棒,比我的查询简单得多,也更简洁。但是,它仍然存在一个问题,即我希望从between子句中获得最新的匹配。@Alex它的性能也会更好,因为过滤仅在内部join的ON子句中的一个级别上完成。关于SELECT MAXS.AtTime,这里是查询的其余部分。我已经测试过了,它确实给出了从2分钟到通过日期的范围内的值。这看起来很棒,比我的查询简单得多,也更简洁。但是,它仍然存在一个问题,即我希望从BEVERY子句中获得最新的匹配。@Alex它的性能也会更好,因为过滤只在内部连接的ON子句中的一个级别上完成。关于SELECT MAXS.AtTime,这里是查询的其余部分。
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))