Низкая производительность табличных переменных при вставке в хранимой процедуре SQL Server - PullRequest
9 голосов
/ 29 октября 2009

У нас проблемы с производительностью при использовании табличной переменной в хранимой процедуре.

Вот что на самом деле происходит:

DECLARE @tblTemp TABLE(iId_company INT)

INSERT INTO @tblTemp(iId_company)
  SELECT id FROM .....

SELECT возвращает 138 результатов, но вставка в переменную TABLE занимает 1 мин 15, но когда я использую временную таблицу с тем же SELECT, woops занимает 0 с:

CREATE TABLE #temp (iId_company INT)

INSERT INTO #temp(iId_company)
  SELECT id FROM ...

Что может вызвать поведение?

Ответы [ 4 ]

10 голосов
/ 29 октября 2009

Использовать временную таблицу. Вы увидите гораздо лучшую производительность.

Подробное объяснение причин этого выходит за рамки первоначального вопрос однако, чтобы подвести итог:

  • Переменная таблицы оптимизирована для одного Строка, SQL Server, то есть предполагает 1 строка будет возвращена.
  • Переменная таблицы не создает статистика.

Google временная таблица Vs. переменная таблицы для множества ресурсов и обсуждений. Если вам нужна конкретная помощь, отправьте мне электронное письмо или свяжитесь со мной в Twitter.

0 голосов
/ 30 октября 2009

Ключевым моментом для временных таблиц также является то, что вы можете размещать на них индексы и т. Д., А с табличными переменными - нет.

0 голосов
/ 29 октября 2009

Не то чтобы это имело значение, но как выглядит ваш избранник? У меня была проблема в SQL Server 2005, когда мой выбор выполнялся относительно быстро, за то, что делал мой запрос, скажем, 5 минут, чтобы вернуть все данные по проводам около 150 000 строк. Но когда я попытался вставить тот же самый выбор в временную таблицу или табличную переменную, оператор выполнялся более 1 часа, прежде чем я его убил. Мне еще предстоит выяснить, что на самом деле происходит. В итоге я добавил порядок применения подсказок к запросу, и он начал вставляться быстрее.

0 голосов
/ 29 октября 2009

Как правило, для небольших наборов данных переменная таблицы должна быть быстрее, чем временная таблица. Для больших наборов данных производительность будет падать, поскольку переменные таблицы не поддерживают параллелизм (см. этот пост ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...