Использование столбца табличного параметра в хранимой процедуре - - PullRequest
0 голосов
/ 05 августа 2011

Я передаю 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.

1 Ответ

3 голосов
/ 05 августа 2011

Попробуйте использовать это 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))
...