0

2 つのフィールド ( adatetimeおよび a varchar(3)) を持つ TVP をストアド プロシージャに渡しています。テーブルの datetime 列が TVP の datetime の 1 つまたは最大で 2 つに等しいすべてのテーブル行を返そうとしています。数分前に(重複は気にしませんが、ないほうがいいです)。

これは私が思いついたものです - 現在非常に遅く (~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

編集クエリが思いどおりにならないことに気付きました-2分の範囲内でtvp行ごとに最新の一致するテーブルの日付/価格行inを返したいのですが、現時点では、そのセットで一致するすべてのものを取得します. 使用してみましたが、可能な一致が 1 つに制限されるため、スクエア 1 に戻ります。betweenMAX(AtTime)

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 に答える