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 に戻ります。between
MAX(AtTime)