【问题标题】:Using Table-Valued Parameter's column in stored proc -在存储过程中使用表值参数的列 -
【发布时间】:2011-08-05 10:53:22
【问题描述】:

我将带有 2 个字段(datetimevarchar(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


【解决方案1】:

试试这个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))

【讨论】:

  • 我已经测试过了,它确实给出了从 2 分钟到过去日期范围内的值。
  • 这看起来很棒,比我的查询更简单、更简洁。但是,它仍然存在我想从between 子句中获得最新匹配的问题。
  • @Alex 它的性能也会更好,因为过滤只在ONINNER JOIN 子句中的一级完成
  • SELECT MAX(S.AtTime) 怎么样,剩下的查询在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2015-06-13
相关资源
最近更新 更多