Published on

November 16, 2014

Понимание временных таблиц в SQL Server

После моей предыдущей статьи о “Создании объекта временной таблицы внутри TempDB” я получил множество запросов на эту тему. Кажется, что существует потребность в новом взгляде на эти фундаментальные концепции, которые мы знаем уже давно. Один особенный электронный письмо привлекло мое внимание, и я считаю, что стоит обратиться к нему здесь, на блоге.

В письме говорится:

“Привет, Пинал, мне очень понравилась ваша статья о создании таблицы внутри TempDB. Шаги были очень полезными для меня, чтобы понять, как работает tempdb. Как новичок в первый год своей карьеры, я каким-то образом нашел смелость отправить вам это письмо. Я не уверен, что вы ответите, но я подумал, что у вас может быть некоторые указания, чтобы помочь мне. Когда я следовал шагам на своем локальном ноутбуке, я увидел точно такие же результаты, как вы показали в своей статье. Я был так взволнован, что решил проверить, как выглядят наши dev/test среды, поэтому я запустил DMV для пользовательских таблиц там. К моему удивлению, я обнаружил несколько объектов с именами вроде #B0D42C6C, #D5F46A7C и так далее. Они не похожи на имена таблиц, которые вы упомянули в предыдущей статье. Даже после запуска того же DMV через 5-10 минут, я все еще вижу много этих таблиц в своей системе. Что это за таблицы? Они создаются системой? Используются ли они моим приложением? Как я могу узнать больше о них?”

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

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

USE AdventureWorks2012
GO

DROP PROCEDURE TempTable_Objects
GO

CREATE PROCEDURE TempTable_Objects
AS
CREATE TABLE #temptable_in_sp (
    id INT NOT NULL IDENTITY (1, 1),
    name CHAR(30) NOT NULL,
    DOJ DATETIME NOT NULL
)

-- Делайте все, что хотите с временной таблицей :)

-- Подождите, чтобы процедура не завершилась слишком быстро :)
WAITFOR DELAY '00:00:05'
GO

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

Сессия 1:

-- Выполните хранимую процедуру в Сессии 1
EXEC TempTable_Objects
WAITFOR DELAY '00:00:05'
EXEC TempTable_Objects

Сессия 2:

-- Результаты, когда процедура началась
SELECT * FROM tempdb.sys.sysobjects WHERE TYPE = 'U'
WAITFOR DELAY '00:00:05'

-- Результаты, когда первый вызов процедуры закончился
SELECT * FROM tempdb.sys.sysobjects WHERE TYPE = 'U'
WAITFOR DELAY '00:00:05'

-- Результаты, когда процедура была вызвана снова
SELECT * FROM tempdb.sys.sysobjects WHERE TYPE = 'U'

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

При дальнейшем исследовании я обнаружил, что в их среде регулярно генерируются временные таблицы каждые 15-20 минут. Это поведение было постоянным в их среде. Если вы проверите Обозреватель объектов SQL Server Management Studio, вы также увидите эти объекты в списке.

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

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.