Я передаю TVP с 2 полями (datetime
и varchar(3)
) в сохраненный процесс, и я пытаюсь вернуть все строки таблицы, где столбец datetime таблицы либо равен одному из дата TVP или до пары минут раньше (я не против дубликатов, но предпочел бы без).
Это то, что я придумал - в настоящее время он очень медленный (~ 5 секунд!), И я не уверен, что делать, чтобы его улучшить. Индексировать таблицу? Какой столбец? AtTime
Я знаю, что это сложный запрос, так как ему нужно вычислить диапазон, который нужно искать, прежде чем пытаться сопоставить строку, поэтому, если есть совершенно другой, но предпочтительный способ сделать это, пожалуйста, дайте мне знать. Кроме того, входной TVP имеет ~ 300 строк, а сама таблица содержит более 200 тыс., Поэтому есть много данных для поиска и поиска.
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
edit Я только что понял, что мой in
запрос не будет делать то, что я хочу - я хочу вернуть последний
сопоставление строки даты / цены таблицы на строку тв в пределах 2-минутного диапазона , в то время как в данный момент она выдаст мне все, что соответствует этому between
набору. Я попытался использовать MAX(AtTime)
, но это ограничивает одно возможное совпадение, поэтому я возвращаюсь к квадрату 1.