我将带有2个字段(datetime
和varchar(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.
答案 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))