Где хранятся временные таблицы sql server

Где хранятся временные таблицы sql server

В SQL Server временные таблицы создаются в системной базе данных tempdb. Это касается как локальных (#имя), так и глобальных (##имя) временных таблиц. Они существуют только в течение сессии или соединения, в рамках которого были созданы, и автоматически удаляются после его завершения.

tempdb – общий ресурс, используемый всеми сессиями и процессами. При создании временной таблицы SQL Server выделяет для неё пространство на диске или в памяти в зависимости от объёма данных и текущей конфигурации сервера. Физически такие таблицы размещаются в файловой группе PRIMARY базы tempdb, файлы которой по умолчанию находятся в каталоге, указанном при установке сервера.

Если объём данных мал, таблица может храниться в памяти (in-memory), но при увеличении нагрузки SQL Server автоматически использует диск. Это делает важным мониторинг размера и производительности tempdb, особенно на серверах с высокой нагрузкой или большим числом параллельных операций. Рекомендуется размещать файлы tempdb на быстром SSD-накопителе и распределять нагрузку через несколько файлов данных, чтобы снизить вероятность блокировок и ускорить доступ.

Стоит также учитывать, что при создании временных таблиц с индексами или большими наборами данных может значительно увеличиться фрагментация и размер tempdb. Регулярная перезагрузка службы SQL Server очищает базу tempdb, но для контролируемого поведения лучше анализировать использование временных таблиц и оптимизировать их структуру и количество.

Физическое расположение локальных временных таблиц в tempdb

Физическое расположение локальных временных таблиц в tempdb

Локальные временные таблицы создаются в базе tempdb и физически размещаются на том же дисковом пространстве, что и сама tempdb. После создания таблицы, SQL Server выделяет страницы данных в одном из файлов tempdb – сначала в основном файле tempdev (.mdf), затем при необходимости в дополнительных (.ndf).

Каждая временная таблица получает уникальное имя в формате #ИмяТаблицы______________________цифровой_суффикс, где суффикс обеспечивает изоляцию между сессиями. Эти таблицы хранятся в системном пространстве tempdb и отображаются в представлении sysobjects этой базы, пока активна сессия, в которой они были созданы.

Физические страницы размещаются в файловой группе PRIMARY базы tempdb. Если tempdb настроена на несколько файлов, SQL Server использует механизм распределения по пропорциональному заполнению (proportional fill), при котором нагрузка равномерно распределяется между файлами. Это может повлиять на производительность при интенсивной работе с временными таблицами.

Для анализа размещения можно использовать представление sys.dm_db_database_page_allocations с указанием идентификатора базы tempdb (обычно 2) и object_id временной таблицы. Это позволяет отследить, в какие именно файлы и на какие страницы записаны данные.

Рекомендуется размещать tempdb на быстрых дисках (SSD) и исключать из резервного копирования. Для многопроцессорных серверов желательно настроить несколько файлов tempdb одинакового размера, чтобы избежать точки контеншенов на глобальном распределителе страниц (GAM/SGAM/ПFS).

Как SQL Server управляет памятью для глобальных временных таблиц

Как SQL Server управляет памятью для глобальных временных таблиц

Глобальные временные таблицы создаются с префиксом ## и доступны всем сеансам до явного удаления или завершения последнего использующего их подключения. SQL Server размещает такие таблицы в tempdb, как и локальные временные таблицы, но отличается поведение по части управления ресурсами и блокировками.

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

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

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

Для контроля использования памяти рекомендуется включать сбор статистики по tempdb: использовать представление sys.dm_db_task_space_usage и следить за tempdb sys.dm_db_session_space_usage, чтобы понимать, сколько ресурсов потребляют глобальные таблицы. В случае подозрения на утечку памяти – проверять sys.dm_exec_requests и sys.dm_tran_locks для выявления зависших сессий.

Очистка происходит только после закрытия последнего подключения, использующего таблицу, поэтому явное удаление через DROP TABLE ##имя после завершения работы – обязательная практика. Это освобождает как буфер, так и аллокированное место на диске, снижая риск переполнения tempdb.

Влияние сессий и подключений на хранение временных таблиц

Локальные временные таблицы (с префиксом #) существуют только в пределах одной сессии. Они создаются в tempdb и автоматически удаляются при закрытии соединения. При использовании нескольких соединений, даже в рамках одного приложения, каждая сессия получает собственную копию временной таблицы с идентификатором, добавленным SQL Server для изоляции. Это исключает возможность прямого доступа из другой сессии, даже если имя таблицы совпадает.

Глобальные временные таблицы (с префиксом ##) доступны для всех сессий, но только до тех пор, пока открыта хотя бы одна сессия, в которой они были созданы. Если исходное соединение завершено, а другие ещё используют таблицу, она сохраняется до тех пор, пока не закроется последнее подключение, обращающееся к ней.

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

Операторы, запускаемые параллельно (например, через SQL Agent или Service Broker), используют отдельные сессии, поэтому обращение к временным таблицам должно быть синхронизировано. В противном случае возможны ошибки, связанные с отсутствием таблицы или конфликтом имён.

Для устранения проблем доступа при необходимости использования временных данных в разных сессиях лучше применять глобальные временные таблицы или альтернативно – табличные переменные, если допустим объём данных и нет зависимости от индексов или статистики.

Чем отличается размещение временных таблиц от табличных переменных

Чем отличается размещение временных таблиц от табличных переменных

Временные таблицы и табличные переменные используют tempdb, но с разными механизмами хранения и поведения при выполнении запросов.

  • Временные таблицы создаются явно через CREATE TABLE #имя. Они физически размещаются в tempdb и участвуют в транзакциях. SQL Server сохраняет их метаданные в системных таблицах tempdb, как для обычных таблиц.
  • Табличные переменные объявляются через DECLARE @имя TABLE. Их структура тоже создаётся в tempdb, но регистрация ограничена скоупом выполняемого кода. Они не ведут полноценный журнал транзакций, что ограничивает откат изменений.
  • При наличии индексов и большого объема данных временные таблицы масштабируются лучше. SQL Server может использовать статистику для построения более точного плана выполнения запроса. Табличные переменные не собирают статистику автоматически.
  • Параллелизм в запросах с табличными переменными не используется, поскольку оптимизатор ограничен в информации о данных. Временные таблицы не имеют такого ограничения.
  • Если требуется передавать данные между партиями или сохранять промежуточные результаты с доступом из разных процедур, предпочтительнее временные таблицы. Табличные переменные уместны при малом объеме и коротком сроке жизни данных.

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

Как определить фактическое местоположение временной таблицы с помощью запросов

Как определить фактическое местоположение временной таблицы с помощью запросов

В SQL Server локальные временные таблицы (с префиксом #) и глобальные (с префиксом ##) физически размещаются в tempdb. Чтобы подтвердить это, можно использовать представление sysobjects или sys.tables внутри tempdb.

Запрос для отображения списка временных таблиц, созданных в текущей сессии:


SELECT name, create_date, object_id
FROM tempdb.sys.objects
WHERE name LIKE '#%'

Для получения сведений о размещении данных используется представление sys.dm_db_session_space_usage. Оно позволяет отследить, сколько места занимает каждая сессия в tempdb, включая использование временных таблиц:


SELECT session_id, user_objects_alloc_page_count, user_objects_dealloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id = @@SPID

Чтобы определить физические файлы, где размещается tempdb, выполните:


SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb')

Для получения более детальной информации о размещении конкретной временной таблицы можно использовать:


DBCC IND('tempdb', 'имя_временной_таблицы', -1)

Этот запрос покажет страницы данных, на которых хранятся строки таблицы. Используя номер страницы, можно обратиться к содержимому через:


DBCC PAGE('tempdb', файл, страница, 3) WITH TABLERESULTS

Параметры файл и страница берутся из результата DBCC IND. Эти команды требуют включённой трассировки 3604:


DBCC TRACEON(3604)

Таким образом, вся информация о временных таблицах, включая физическое размещение, доступна через служебные представления и команды DBCC в tempdb.

Настройки tempdb, влияющие на поведение временных таблиц

Автоматическое распределение файлов tempdb – важно следить за количеством файлов данных для tempdb. Рекомендуется настроить несколько файлов (не менее 4-8) с равным размером, чтобы избежать блокировок из-за конкурентного доступа. Этот параметр улучшает распределение нагрузки между дисковыми устройствами и уменьшает вероятность возникновения проблем с производительностью.

Размер файлов данных – оптимальный начальный размер файлов данных tempdb должен быть установлен с учетом текущих нагрузок и объема данных, с которыми работает сервер. Часто рекомендуется устанавливать начальный размер файлов, близкий к ожидаемому объему использования tempdb, чтобы избежать автоматического роста файлов и перераспределения ресурсов во время работы.

Автозаполнение – параметр «AutoGrow» позволяет файлам tempdb автоматически увеличиваться при достижении предельного размера. Однако слишком частое изменение размера файлов может негативно повлиять на производительность. Рекомендуется настроить AutoGrow так, чтобы файлы увеличивались на фиксированный размер (например, на 1 ГБ), а не на процент от текущего объема.

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

TempDB Recovery Model – для большинства сценариев работы с временными таблицами рекомендуемый режим восстановления для tempdb – Simple. Это исключает необходимость в частых и ресурсоемких операций журнала транзакций, особенно при интенсивной работе с временными объектами.

Параметр FILESTREAM – если в tempdb используются большие двоичные объекты (например, для хранения файлов или изображений), стоит обратить внимание на настройку FILESTREAM. Неправильная настройка может привести к снижению производительности при работе с большими объемами данных.

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

Вопрос-ответ:

Где размещаются временные таблицы в SQL Server?

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

Какие типы временных таблиц существуют в SQL Server?

В SQL Server есть два типа временных таблиц: локальные и глобальные. Локальные таблицы начинаются с одного решеточного знака (#), и доступны только в пределах сессии или подключения, в котором они были созданы. После завершения сессии таблица автоматически удаляется. Глобальные таблицы начинаются с двух решеточных знаков (##), и они доступны всем пользователям и подключениям, пока не будет завершена последняя сессия, использующая эту таблицу. Глобальные таблицы удаляются, когда закрываются все подключения, использующие их.

Какое влияние имеет размер временных таблиц на производительность SQL Server?

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

Можно ли использовать индексы на временных таблицах в SQL Server?

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

Как управлять временем жизни временных таблиц в SQL Server?

В SQL Server время жизни временной таблицы зависит от типа таблицы и сессии. Локальная временная таблица существует только в рамках сессии, и она автоматически удаляется по завершении сессии или подключения. Глобальная временная таблица существует до тех пор, пока не завершатся все сессии, использующие ее. Если необходимо удалить временную таблицу раньше времени, можно использовать команду DROP TABLE. Также, при необходимости, можно принудительно удалить временную таблицу с помощью команды TRUNCATE TABLE, которая очистит данные, но оставит структуру таблицы.

Где размещаются временные таблицы в SQL Server?

В SQL Server временные таблицы могут размещаться в разных местах, в зависимости от того, как они создаются. Локальные временные таблицы, созданные с помощью команды `CREATE TABLE #table_name`, хранятся в системе баз данных, в том числе в базе `tempdb`. Эти таблицы существуют только в рамках сеанса или до завершения соединения. Если же таблица создается с помощью `CREATE TABLE ##table_name` (глобальная временная таблица), она будет доступна всем пользователям, но также будет храниться в базе `tempdb`. Важно, что такие таблицы автоматически удаляются после завершения сеанса или соединения, если они не были явно удалены.

Как можно контролировать место размещения временных таблиц в SQL Server?

Контроль над местом размещения временных таблиц в SQL Server осуществляется в первую очередь через настройки базы данных `tempdb`, так как все временные таблицы хранятся именно там. Местоположение базы `tempdb` можно изменить, переместив ее на другой диск с помощью команд настройки SQL Server. Однако прямое указание на другое место для временной таблицы невозможно. Чтобы оптимизировать работу с `tempdb`, можно управлять её размером, настройками файлов и размещением на отдельном физическом диске для уменьшения нагрузок на систему.

Ссылка на основную публикацию