Использование табличных переменных в хранимых процедурах вместо простого выбора из таблиц или представления? - PullRequest
2 голосов
/ 11 августа 2010

Я сейчас смотрю на sprocs, которые, похоже, следуют поведению, показанному ниже

DECLARE @tablevar TABLE
(
    FIELD1   int,
    FIELD2   int,
    FIELD3   varchar(50),
    -- etc
)

INSERT INTO @tablevar
(
    FIELD1,
    FIELD2,
    FIELD3,
    -- etc
)
SELECT FIELD1, FIELD2, FIELD3, -- etc
FROM
TableA Inner Join TableB on TableA.Foo = TableB.Foo
Inner Join TableC on TableB.Bar = TableC.Bar
-- Where, Order By, etc.

Select FIELD1, FIELD2, FIELD3, -- etc
FROM @tablevar

Есть ли преимущество в использовании этого подхода по сравнению с использованием простого оператора select и пропуском табличной переменной?

Ответы [ 2 ]

7 голосов
/ 11 августа 2010

Если вы планируете использовать его точно так же, как отправлено (заполнить его, а затем выбрать результат), вы ничего не получите.Вы просто облагаете налогом свой SQL Server, требуя дополнительной загрузки ЦП и памяти.

Ответ меняется, если вы планируете делать больше с табличной переменной, и зависит от того, как вы можете его использовать.Если он будет содержать небольшой объем данных, может быть более эффективно использовать его в последующих операторах.Если вы намереваетесь использовать его несколько раз, а первоначальная популяция стоит дорого, то это может быть более эффективным.

Я продолжаю говорить, что возможно, поскольку каждая ситуация различна, и вам нужно будет проверить, чтобы проверитьимеет значение.

2 голосов
/ 11 августа 2010

Я не вижу никакой выгоды в этом, если все, что вы делаете, это заполняете таблицу и выбираете из нее

...