0

我将带有 2 个字段(adatetime和 a varchar(3))的 TVP 传递到存储过程中,并且我试图返回表的 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 格。

4

1 回答 1

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))
于 2011-08-05T11:01:47.723 回答