我将带有 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 格。