2009-10-22 2 views
2

Я искал неприятную хранимую процедуру и заметил, что после ее запуска, и я закрыл сеанс, в tempdb все еще осталось много временных таблиц. Они имеют имена, как следующее:Таблицы Temp в SQL Server 2005 не удаляются автоматически

#000E262B 
#002334C4 
#004E1D4D 
#00583EEE 
#00783A7F 
#00832777 
#00CD403A 
#00E24ED3 
#00F75D6C 

Если я запускаю этот код:

if object_id('tempdb..#000E262B') is null 
print 'Does NOT exist!' 

я получаю:

Does NOT exist! 

Если я:

use tempdb 
go 
drop TABLE #000E262B 

Я получаю ошибка:

Msg 3701, Level 11, State 5, Line 1 
Cannot drop the table '#000E262B', because it does not exist or you do not have permission. 

Я подключен к SQL Server как sysadmin. Использование SP3 64-бит. В настоящее время у меня более 1100 этих таблиц в tempdb, и я не могу избавиться от них. На сервере базы данных нет других пользователей.

Остановка и запуск SQL Server в моем случае не является вариантом.

Спасибо!

+1

Где вы видите, что таблицы все еще существуют? –

+1

use tempdb go select * from INFORMATION_SCHEMA.tables –

ответ

8

http://www.sqlservercentral.com/Forums/Topic456599-149-1.aspx

Если временные таблицы или таблицы значений переменных часто используются тогда, вместо того, опуская их, SQL просто «усекает» их, оставляя определение. Это экономит усилия по воссозданию таблицы в следующий раз, когда это необходимо.

+0

Это отличная информация. –

+0

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

+3

Отбрасывание таблицы или ее выход из области действия фактически не отбрасывают ее немедленно. Ваша партия знает, что вы ее уронили, поэтому вы больше не можете ссылаться на нее, но она все еще существует. Существует фоновый процесс, который обрабатывает фактический процесс удаления. Возможно, посмотрите счетчик «Temp Tables for Destruction», чтобы узнать, действительно ли это является источником вашей проблемы с производительностью. Подробные сведения об этом вы можете найти в разделе «Мониторинг и устранение неполадок» (много прокрутки): http://msdn.microsoft.com/en-us/library/cc966545.aspx#EDAA –

0

Таблицы, созданные с префиксом #, доступны только для текущего соединения. Поэтому любое новое соединение, которое вы создаете, не сможет их увидеть и, следовательно, не сможет их удалить.

Как вы можете сказать, что они все еще существуют? Какую команду вы используете, чтобы это выяснить?

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

+0

Спасибо, Робин, но я единственный пользователь в этом экземпляре базы данных. Соединение, которое их создало, отключено. –

+0

Можете ли вы указать, как вы можете видеть, что эти таблицы все еще существуют? Это использование sp_tables? SELECT * FROM sysobjects? –

Смежные вопросы