Объем временной таблицы?

Я использую временные таблицы #tempTable в моей хранимой процедуре - что я использую для выполнения моих Отчетов ASP.net (Сообщающий о сервисах)

Я делаю что-то как

например, Код

SELECT * INTO #tempTable FROM Contacts WHERE ContactID < 10

Затем я использую что-то как

SELECT o.* FROM #tempTable t INNER JOIN Orders o ON t.ContactID =o.ContactID

возвращать значения к моим отчетам иначе заканчивается для хранимой процедуры

Я не избавляюсь от своего #tempTable

т.е. Я не делаю

DROP TABLE #tempTable

Я считал, что объем временной таблицы только для хранимой процедуры - так делает необходимое вышеупомянутое - если я не делаю вышеупомянутого, во что проблемы будут я входить в будущем

8
задан soldieraman 1 April 2012 в 09:03
поделиться

3 ответа

Хорошей практикой кодирования считается явное удаление каждой создаваемой вами временной таблицы. Если вы выполняете сценарии через SQL Server Management Studio / Query Analyzer, временные таблицы сохраняются до тех пор, пока вы не удалите их явно или пока вы не закроете сеанс.

2
ответ дан 5 December 2019 в 07:56
поделиться

В общем, у вас, вероятно, не возникнет проблем, если вы не удалите временные таблицы. Локальная временная таблица имеет область сеанса или область SP в вашем случае. Он упадет автоматически, когда сеанс будет закрыт или SP завершит работу.

Однако, регулярно следуя этой практике, вы увеличиваете риск возникновения проблем. Например, если вы не используете SP, но отправляете оператор SELECT из ASP .net и оставляете соединение с SQL Server открытым, временная таблица продолжит существовать. Продолжение использования таблиц соединений и других временных таблиц со временем приведет к росту базы данных tempdb.

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

1
ответ дан 5 December 2019 в 07:56
поделиться

Во-первых, локальные временные таблицы, созданные в рамках процедуры, удаляются после ее завершения. Из BOL при создании таблицы :

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

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

Я говорю «эффективно», чтобы поднять еще один вопрос. Я бы не рекомендовал отбрасывать временную таблицу в конце вашей процедуры, хотя я бы добавил проверку непосредственно перед созданием временной таблицы и отбросил бы ее, если она существует (например, , если object_id ('tempdb .. # Foo') не null ). Аргумент против удаления временной таблицы в конце заключается в том, что, вызывая оператор Drop, вы заставляете SQL Server расходовать ресурсы на уничтожение таблицы на месте, пока вы ждете завершения процедуры. Если вместо этого вы позволите ей выйти за пределы области видимости, ваша процедура немедленно завершится, и вы позволите SQL Server уничтожить таблицу в любое время по своему выбору.

11
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: