【发布时间】:2011-08-05 10:53:22
【问题描述】:
我将带有 2 个字段(datetime 和 varchar(3))的 TVP 传递到存储过程中,并且我试图返回表的日期时间列等于其中之一的所有表行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 格。
【问题讨论】:
-
你会输入一些真实的数据吗?
标签: sql performance sql-server-2008 stored-procedures table-valued-parameters