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