база данных tempdb
Область применения:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
База данных SQL в Microsoft Fabric
В этой статье описывается tempdb
системная база данных, глобальный ресурс, доступный всем пользователям, подключенным к экземпляру ядра СУБД в SQL Server, Базе данных SQL Azure или Управляемом экземпляре SQL Azure.
Обзор
Системная база данных tempdb
— это глобальный ресурс, содержащий следующее:
пользовательские объекты, явно создаваемые. К ним относятся:
- Глобальные или локальные временные таблицы и индексы в этих таблицах
- Временные хранимые процедуры
- Табличные переменные
- Таблицы, возвращаемые в функциях с табличным значением
- Курсоры
Пользовательские объекты, которые можно создать в пользовательской базе данных, также можно создать в
tempdb
, однако они создаются без гарантии устойчивости и удаляются при перезапуске экземпляра ядра СУБД.Внутренние объекты, создаваемые ядром СУБД. К ним относятся:
- Рабочие таблицы, хранящие промежуточные результаты буферов, курсоры, сортировки и временное хранилище больших объектов (LOB).
- рабочие файлы для операций хэш-соединения или хэш-агрегации.
- промежуточные результаты сортировки для таких операций, как создание или перестроение индексов (если указать
SORT_IN_TEMPDB
), либо определенных запросовGROUP BY
,ORDER BY
илиUNION
.
Каждый внутренний объект использует минимум девять страниц: страницу IAM и восьмистраничный экстент. Дополнительные сведения см. в разделе Страницы и экстенты.
версия хранит, которые являются коллекциями страниц данных, содержащими строки данных, поддерживающие версионирование строк . Существует два типа: общее хранилище версий и хранилище версий сборки индекса в Интернете. Хранилища версий содержат следующее:
- Версии строк, созданные транзакциями изменения данных в базе данных, которая использует транзакции изоляции на основе версионирования строк
READ COMMITTED
илиSNAPSHOT
. - версии строк, создаваемые транзакциями изменения данных для таких функций, как операции с индексами в режиме онлайн, функции MARS (множественный активный результирующий набор) и триггеры
AFTER
.
- Версии строк, созданные транзакциями изменения данных в базе данных, которая использует транзакции изоляции на основе версионирования строк
Операции в tempdb
минимально фиксируются.
tempdb
создается повторно при каждом запуске ядра СУБД, чтобы система всегда начиналась с пустой базы данных tempdb
. Временные хранимые процедуры и локальные временные таблицы удаляются автоматически при отключении сеанса.
tempdb
никогда не требуется сохранять данные с одного периода работы ядра СУБД на другой. Операции резервного копирования и восстановления для tempdb
недопустимы.
Физические свойства tempdb в SQL Server
В следующей таблице приводятся исходные значения конфигурации для файлов данных и журналов tempdb
в SQL Server. Значения основаны на значениях по умолчанию для базы данных model
. Размеры этих файлов могут немного отличаться для разных выпусков SQL Server.
Файлы | Логическое имя | Физическое имя | Начальный размер | Увеличение размера файлов |
---|---|---|---|---|
Первичные данные | tempdev |
tempdb.mdf |
8 МБ | Автоматическое увеличение на 64 МБ до заполнения диска. |
Вторичные файлы данных | temp# |
tempdb_mssql_#.ndf |
8 МБ | Автоматическое увеличение на 64 МБ до заполнения диска. |
Журнал | templog |
templog.ldf |
8 МБ | Автоматическое увеличение на 64 МБ до максимального размера в 2 ТБ. |
Все файлы данных tempdb
всегда должны иметь одинаковый начальный размер и параметры роста.
Количество файлов данных tempdb
В зависимости от версии ядра СУБД, его конфигурации и рабочей нагрузки, tempdb
может потребоваться несколько файлов данных для устранения проблем с распределением ресурсов.
Рекомендуемое общее количество файлов данных зависит от количества логических процессоров на компьютере. В качестве общего руководства:
- Если число логических процессоров меньше или равно 8, используйте то же количество файлов данных.
- Если число логических процессоров больше восьми, используйте восемь файлов данных.
- Если конкуренция
tempdb
по-прежнему наблюдается, увеличьте количество файлов данных на число, кратное четырем, до тех пор, пока конкуренция не уменьшится до допустимых уровней, или измените рабочую нагрузку.
Дополнительные сведения см. в рекомендациях по уменьшению конфликтов распределения в базе данных tempdb SQL Server.
Чтобы проверить текущие параметры размера и роста для tempdb
, используйте представление каталога sys.database_files в tempdb
.
Перемещение файлов данных tempdb и журналов в SQL Server
Сведения о перемещении файлов журналов и данных tempdb
см. в статье Перемещение системных баз данных.
Параметры базы данных для tempdb в SQL Server
В следующей таблице приводится список значений по умолчанию для каждого параметра базы данных tempdb
, а также возможность его изменения. Чтобы просмотреть текущие настройки этих параметров, используйте представление каталога sys.databases .
Параметр базы данных | Значение по умолчанию | Можно изменить |
---|---|---|
ACCELERATED_DATABASE_RECOVERY |
OFF |
Нет |
ALLOW_SNAPSHOT_ISOLATION |
OFF |
Да |
ANSI_NULL_DEFAULT |
OFF |
Да |
ANSI_NULLS |
OFF |
Да |
ANSI_PADDING |
OFF |
Да |
ANSI_WARNINGS |
OFF |
Да |
ARITHABORT |
OFF |
Да |
AUTO_CLOSE |
OFF |
Нет |
AUTO_CREATE_STATISTICS |
ON |
Да |
AUTO_SHRINK |
OFF |
Нет |
AUTO_UPDATE_STATISTICS |
ON |
Да |
AUTO_UPDATE_STATISTICS_ASYNC |
OFF |
Да |
AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN) |
OFF |
Нет |
CHANGE_TRACKING |
OFF |
Нет |
COMPATIBILITY_LEVEL |
Зависит от версии ядра СУБД. Дополнительные сведения см. в разделе ALTER DATABASE (Transact-SQL) о совместимости уровня. |
Да |
CONCAT_NULL_YIELDS_NULL |
OFF |
Да |
CONTAINMENT |
NONE |
Нет |
CURSOR_CLOSE_ON_COMMIT |
OFF |
Да |
CURSOR_DEFAULT |
GLOBAL |
Да |
Состояние базы данных | ONLINE |
Нет |
Обновление базы данных | READ_WRITE |
Нет |
Доступ пользователя к базе данных | MULTI_USER |
Нет |
DATE_CORRELATION_OPTIMIZATION |
OFF |
Да |
DB_CHAINING |
ON |
Нет |
DELAYED_DURABILITY |
DISABLED Независимо от этого параметра, отложенная устойчивость всегда включена на tempdb . |
Да |
ENCRYPTION |
OFF |
Нет |
MIXED_PAGE_ALLOCATION |
OFF |
Нет |
NUMERIC_ROUNDABORT |
OFF |
Да |
PAGE_VERIFY |
CHECKSUM для новых установок SQL ServerСуществующее PAGE_VERIFY значение может храниться при обновлении экземпляра SQL Server. |
Да |
PARAMETERIZATION |
SIMPLE |
Да |
QUOTED_IDENTIFIER |
OFF |
Да |
READ_COMMITTED_SNAPSHOT |
OFF |
Нет |
RECOVERY |
SIMPLE |
Нет |
RECURSIVE_TRIGGERS |
OFF |
Да |
Брокер услуг | ENABLE_BROKER |
Да |
TARGET_RECOVERY_TIME |
60 | Да |
TEMPORAL_HISTORY_RETENTION |
ON |
Да |
TRUSTWORTHY |
OFF |
Нет |
Описание этих баз данных см. в статье Параметры ALTER DATABASE SET (Transact-SQL).
tempdb в База данных SQL Azure
В Базе данных SQL Azure некоторые аспекты поведения и конфигурации tempdb
отличаются от SQL Server.
Для отдельных баз данных каждая база данных на логическом сервере имеет собственное tempdb
. В эластичном пуле tempdb
— это общий ресурс для всех баз данных в одном пуле, но временные объекты, созданные одной базой данных, не видны другим базам данных в одном эластичном пуле.
Объекты в tempdb
, включая представления каталога и динамические административные представления (DMV), доступны через межбазовую ссылку на базу данных tempdb
. Например, можно запросить представление sys.database_files:
SELECT file_id,
type_desc,
name,
size,
max_size,
growth
FROM tempdb.sys.database_files;
Глобальные временные таблицы в базе данных SQL Azure имеют область видимости, ограниченную базой данных. Дополнительные сведения см. в статье Глобальные временные таблицы с областью действия базы данных в базе данных SQL Azure.
Чтобы узнать больше о размерах в базе данных Azure SQL, см. информацию: tempdb
- модель покупки виртуальных ядер: отдельные базы данных, базы данных в пуле.
- модель покупки DTU: отдельные базы данных, базы данных в группе.
tempdb в Управляемом экземпляре SQL
В Управляемом экземпляре SQL Azure некоторые аспекты поведения tempdb
и конфигурации по умолчанию отличаются от SQL Server.
Можно настроить количество tempdb
файлов, их увеличение и максимальный размер. Дополнительные сведения о настройке tempdb
параметров в управляемом экземпляре SQL Azure см. в разделе "Настройка параметров tempdb для управляемого экземпляра SQL Azure".
Управляемый экземпляр SQL Azure поддерживает временные объекты так же, как и SQL Server, где все глобальные временные таблицы и глобальные временные хранимые процедуры доступны всем сеансам пользователей в одном управляемом экземпляре SQL.
Чтобы узнать больше о tempdb
размерах в управляемом экземпляре SQL Azure, просмотрите ограничения ресурсов.
tempdb в базе данных SQL в Fabric
Дополнительные сведения о размерах tempdb
в базе данных SQL в Microsoft Fabric см. в разделе об ограничениях ресурсов в сравнении компонентов: База данных SQL Azure и база данных SQL в Microsoft Fabric.
Аналогично базе данных Azure SQL, глобальные временные таблицы в SQL-базе данных в Microsoft Fabric имеют область действия базы данных. Дополнительные сведения см. в разделе Глобальные временные таблицы с областью действия базы данных в Azure SQL Database.
Ограничения
С базой данных tempdb
нельзя выполнять следующие операции:
- Добавление файловых групп.
- Резервное копирование или восстановление базы данных.
- Изменение параметров сортировки. Параметрами сортировки по умолчанию являются параметры сортировки сервера.
- Изменение владельца базы данных. Владельцем
tempdb
является sa - Создание моментального снимка базы данных.
- Прекращение использования базы данных.
- Удаление пользователя guest из базы данных.
- Включение фиксации изменений данных.
- Участие в зеркалировании базы данных.
- Удаление первичной файловой группы, первичного файла данных или файла журнала.
- Переименование базы данных или первичной файловой группы.
- Выполнение
DBCC CHECKALLOC
. - Выполнение
DBCC CHECKCATALOG
. - Перевод базы данных в режим
OFFLINE
. - Перевод базы данных или первичной файловой группы в режим
READ_ONLY
.
Разрешения
Любой пользователь может создавать временные объекты в tempdb
.
Пользователи могут получать доступ только к собственным не временным объектам в tempdb
, если они не получают дополнительные разрешения.
Можно отменить разрешение CONNECT
на tempdb
, чтобы предотвратить использование tempdb
пользователем или ролью базы данных. Это не рекомендуется, так как для многих операций требуется использование tempdb
.
Оптимизация производительности tempdb в SQL Server
Размер и физическое размещение файлов tempdb
может повлиять на производительность. Например, если начальный размер tempdb
слишком мал, время и ресурсы могут затрачиваться на автоматическое расширение tempdb
до размера, необходимого для поддержки рабочей нагрузки, каждый раз при перезапуске экземпляра СУБД.
- Если возможно, используйте мгновенная инициализация файлов для повышения производительности операций роста файлов данных.
- Начиная с SQL Server 2022 (16.x), события роста файла журнала транзакций до 64 МБ также могут воспользоваться мгновенной инициализацией файла. Дополнительные сведения см. в разделах мгновенной инициализации файла ижурнала транзакций.
- Заранее выделите место для всех файлов
tempdb
, установив для файла размер, достаточный для обеспечения обычной рабочей нагрузки в среде. Предварительное выделение предотвращает слишком частое автоматическое увеличениеtempdb
, что может негативно повлиять на производительность. - Файлы в базе данных
tempdb
должны быть настроены для автоматического увеличения, чтобы обеспечить пространство во время незапланированных событий роста. - Разделение
tempdb
на несколько файлов данных равного размера может повысить эффективность операций, использующихtempdb
.- Чтобы избежать дисбаланса распределения данных, файлы данных должны иметь одинаковый начальный размер и параметры роста, так как ядро СУБД использует алгоритм пропорциональной заливки, который способствует выделению в файлах с большим объемом свободного места.
- Установите разумный размер прироста файла, например 64 МБ, и сделайте одинаковым прирост для всех файлов данных, чтобы предотвратить дисбаланс роста.
Чтобы проверить текущий размер и параметры увеличения для tempdb
, используйте следующий запрос:
SELECT name AS file_name,
type_desc AS file_type,
size * 8.0 / 1024 AS size_mb,
max_size * 8.0 / 1024 AS max_size_mb,
CAST(IIF(max_size = 0, 0, 1) AS bit) AS is_autogrowth_enabled,
CASE WHEN growth = 0 THEN growth
WHEN growth > 0 AND is_percent_growth = 0 THEN growth * 8.0 / 1024
WHEN growth > 0 AND is_percent_growth = 1 THEN growth
END
AS growth_increment_value,
CASE WHEN growth = 0 THEN 'Autogrowth is disabled.'
WHEN growth > 0 AND is_percent_growth = 0 THEN 'Megabytes'
WHEN growth > 0 AND is_percent_growth = 1 THEN 'Percent'
END
AS growth_increment_value_unit
FROM tempdb.sys.database_files;
Поместите базу данных tempdb
в быструю подсистему ввода-вывода. Отдельные файлы данных или группы файлов данных tempdb
не обязательно должны находиться на разных дисках, если не наблюдаются узкие места ввода-вывода на уровне диска.
Если между tempdb
и пользовательскими базами данных существует спор ввода-вывода, поместите tempdb
файлы на диски, которые отличаются от дисков, используемых пользовательскими базами данных.
Примечание.
Чтобы повысить производительность, отложенная устойчивость всегда включена в tempdb
, даже если для параметра базы данных DELAYED_DURABILITY
установлено на DISABLED
. Так как tempdb
создается при запуске, он не проходит процесс восстановления и не обеспечивает гарантию устойчивости.
Увеличение производительности базы данных tempdb в SQL Server
Представлено в SQL Server 2016 (13.x)
- Временные таблицы и табличные переменные кэшируются. Кэширование позволяет операциям удаления и создания временных объектов выполняться очень быстро. Кэширование также снижает вероятность возникновения состязаний, связанных с метаданными и выделением страниц.
- Усовершенствован протокол блокировки выделения страниц для уменьшения числа используемых блокировок
UP
(обновление). - Снижены затраты ресурсов на ведение журнала
tempdb
— уменьшено потребление пропускной способности подсистемы ввода-вывода файлом журналаtempdb
. - Установщик SQL добавляет несколько файлов данных
tempdb
во время нового экземпляра установки. Просмотрите рекомендации и настройтеtempdb
на странице конфигурации ядра СУБД или используйте параметр командной строки/SQLTEMPDBFILECOUNT
. По умолчанию программа установки SQL добавляет столько файлов данныхtempdb
, сколько логических процессоров, или максимум восемь, в зависимости от того, что меньше. - При наличии множества файлов данных
tempdb
автоматическое увеличение выполняется для всех файлов в одно время и в равном объеме согласно параметрам увеличения. Флаг трассировки 1117 больше не требуется. Дополнительные сведения см. в статье об изменениях -T1117 и -T1118 для баз данных TEMPDB и пользовательских баз данных. - Для всех выделений памяти в
tempdb
используются унифицированные экстенты. Флаг трассировки 1118 больше не требуется. Дополнительные сведения об улучшениях производительности вtempdb
см. в статье блога TEMPDB — Files and Trace Flags and Updates, Oh My! (TEMPDB — файлы, флаги трассировки и обновления). - Свойство
AUTOGROW_ALL_FILES
всегда включается для файловой группыPRIMARY
.
Представлено в SQL Server 2017 (14.x)
- Программа установки SQL улучшает рекомендации по выделению файлов на этапе начальной настройки. Программа установки SQL предупреждает клиентов, если начальный размер файла установлен на значение больше 1 ГБ и мгновенная инициализация файлов не включена, чтобы предотвратить задержки при запуске экземпляра.
- Динамическое представление управления sys.dm_tran_version_store_space_usage отслеживает использование хранилища версий в каждой базе данных. Это динамическое административное представление полезно для администраторов баз данных, которые хотят заранее спланировать размер
tempdb
на основе требований по использованию хранилища версий каждой базы данных. -
интеллектуальные функции обработки запросов, такие как адаптивные соединения и обратная связь предоставления памяти, снижают объем памяти при последовательном выполнении запроса, уменьшая
tempdb
использование.
Представлено в SQL Server 2019 (15.x)
- Ядро СУБД не использует параметр
FILE_FLAG_WRITE_THROUGH
при открытииtempdb
файлов, чтобы обеспечить максимальную пропускную способность диска. Так какtempdb
повторно создается при запуске, этот параметр не требуется для обеспечения устойчивости данных. Дополнительную информацию оFILE_FLAG_WRITE_THROUGH
смотрите в разделе «Ведение журналов и алгоритмы хранения данных», которые повышают надежность данных в SQL Server. -
оптимизированные для памяти метаданные TempDB устраняют конфликт метаданных временных объектов в
tempdb
. - Обновления страницы Свободного Пространства Страниц (PFS) уменьшают конфликты при блокировке страниц во всех базах данных, проблема, наиболее часто встречающаяся в
tempdb
. Это улучшение изменяет механизм управления параллельным выполнением обновлений страниц PFS, позволяя обновлять их под общей блокировкой, а не под эксклюзивной блокировкой. Это поведение по умолчанию используется во всех базах данных (включаяtempdb
) начиная с SQL Server 2019 (15.x). Для получения дополнительной информации о страницах PFS читайте В деталях: страницы GAM, SGAM и PFS. - По умолчанию новая установка SQL Server на Linux создает несколько
tempdb
файлов данных на основе количества логических ядер (с до восьми файлов данных). Это не применимо к обновлениям основной или дополнительной версии на месте. Каждыйtempdb
файл данных составляет 8 МБ с автоматическим ростом 64 МБ. Это поведение аналогично поведению установки SQL Server по умолчанию в Windows.
Представлено в SQL Server 2022 (16.x)
- Улучшенная масштабируемость благодаря усовершенствованию параллелизма защелки системной страницы. Параллельное обновление страниц глобальной карты распределения (GAM) и общей глобальной карты распределения (SGAM) сокращает состязание за кратковременную блокировку страниц при выделении и освобождении страниц данных и экстентов. Эти улучшения применяются ко всем пользовательским базам данных и особенно полезны при высоких нагрузках в
tempdb
. Для получения дополнительной информации о страницах GAM и SGAM прочитайте Under the covers: GAM, SGAM и страницы PFS. Дополнительные сведения см. в статьях "Улучшения параллелизма системной страницы" (Ep. 6) | Предоставленные данные.
Метаданные TempDB, оптимизированные для памяти
Исторически конкуренция за временные метаданные объектов была узким местом для повышения масштабируемости многих рабочих нагрузок SQL Server. Для решения этой проблемы SQL Server 2019 (15.x) представила функцию, которая входит в семейство функций базы данных в памяти: метаданные TempDB, оптимизированные для памяти.
Включение функции метаданных TempDB с оптимизацией для памяти устраняет это узкое место для рабочих нагрузок, которые ранее ограничивались конкуренцией метаданных временных объектов внутри tempdb
. Начиная с SQL Server 2019 (15.x), системные таблицы, участвующие в управлении временными метаданными объектов, могут стать незащищенными, не устойчивыми и оптимизированными для памяти таблицами.
Совет
Из-за текущих ограничений , рекомендуется включать метаданные TempDB, оптимизированные для памяти, только в случае, если возникают проблемы с метаданными объектов, которые значительно влияют на рабочие нагрузки.
Следующий диагностический запрос возвращает одну или несколько строк, если происходит конкуренция метаданных временных объектов. Каждая строка представляет собой системную таблицу и показывает количество сеансов, претендующих на доступ к этой таблице в момент выполнения этого диагностического запроса.
SELECT OBJECT_NAME(dpi.object_id, dpi.database_id) AS system_table_name,
COUNT(DISTINCT(r.session_id)) AS session_count
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.fn_PageResCracker(r.page_resource) AS prc
CROSS APPLY sys.dm_db_page_info(prc.db_id, prc.file_id, prc.page_id, 'LIMITED') AS dpi
WHERE dpi.database_id = 2
AND dpi.object_id IN (3, 9, 34, 40, 41, 54, 55, 60, 74, 75)
AND UPPER(r.wait_type) LIKE N'PAGELATCH[_]%'
GROUP BY dpi.object_id, dpi.database_id;
Просмотрите это семиминутное видео, чтобы узнать, как и когда использовать функцию метаданных TempDB, оптимизированной для памяти:
Примечание.
В настоящее время функция метаданных TempDB, оптимизированная для памяти, недоступна в Базе данных SQL Azure, базе данных SQL в Microsoft Fabric и Управляемом экземпляре SQL Azure.
Настройка и использование метаданных TempDB, оптимизированных для памяти
В следующих разделах приведены действия по включению, настройке, проверке и отключению функции метаданных TempDB, оптимизированной для памяти.
Включить
Чтобы включить эту функцию, используйте следующий сценарий:
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;
Для получения дополнительной информации см. раздел ALTER SERVER. Чтобы это изменение конфигурации вступило в силу, нужно перезапустить службу.
Вы можете проверить, является ли tempdb
оптимизированной для памяти, используя следующую команду T-SQL:
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized');
Если возвращаемое значение равно 1, а после включения функции произошла перезагрузка, то эта функция включена.
Если сервер не удается запустить по какой-либо причине после включения метаданных TempDB, оптимизированных для памяти, можно обойти эту функцию, запуская экземпляр механизма базы данных с минимальной конфигурацией с помощью параметра запуска -f
. Затем можно отключить функцию и удалить параметр -f
для перезапуска ядра СУБД в обычном режиме.
Привязка к пулу ресурсов для ограничения использования памяти
Чтобы защитить сервер от потенциального переполнения памяти, рекомендуется привязать tempdb
к пулу ресурсов, который ограничивает объем памяти, потребляемый метаданными TempDB, оптимизированными для работы с памятью. Следующий пример скрипта создает пул ресурсов и устанавливает максимальный объем памяти на 20%, включает регулятор ресурсов, и привязывает tempdb
к пулу ресурсов.
В этом примере используется 20% в качестве ограничения памяти для демонстрационных целей. Оптимальное значение в вашей среде может быть больше или меньше в зависимости от рабочей нагрузки и может измениться с течением времени, если рабочая нагрузка изменится.
CREATE RESOURCE POOL tempdb_resource_pool
WITH (MAX_MEMORY_PERCENT = 20);
ALTER RESOURCE GOVERNOR RECONFIGURE;
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON
(RESOURCE_POOL = 'tempdb_resource_pool');
Это изменение также требует, чтобы перезапуск службы вступил в силу, даже если метаданные TempDB, оптимизированные для памяти, уже включены.
Проверка привязки пула ресурсов и мониторинг использования памяти
Чтобы убедиться, что tempdb
привязаны к пулу ресурсов и для мониторинга статистики использования памяти для пула, используйте следующий запрос:
WITH resource_pool AS
(
SELECT p.pool_id,
p.name,
p.max_memory_percent,
dp.max_memory_kb,
dp.target_memory_kb,
dp.used_memory_kb,
dp.out_of_memory_count
FROM sys.resource_governor_resource_pools AS p
INNER JOIN sys.dm_resource_governor_resource_pools AS dp
ON p.pool_id = dp.pool_id
)
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized') AS is_tempdb_memory_optimized_metadata_enabled,
rp.name AS resource_pool_name,
rp.max_memory_percent,
rp.max_memory_kb,
rp.target_memory_kb,
rp.used_memory_kb,
rp.out_of_memory_count
FROM sys.databases AS d
LEFT JOIN resource_pool AS rp
ON d.resource_pool_id = rp.pool_id
WHERE d.name = 'tempdb';
Удаление привязки пула ресурсов
Чтобы удалить привязку пула ресурсов, сохранив включенные метаданные TempDB, оптимизированные для памяти, выполните следующую команду и перезапустите службу:
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;
Отключить
Чтобы отключить метаданные TempDB, оптимизированные для памяти, выполните следующую команду и перезапустите службу:
ALTER SERVER CONFIGURATION
SET MEMORY_OPTIMIZED TEMPDB_METADATA = OFF;
Ограничения метаданных TempDB, оптимизированных для памяти
Для включения или отключения функции метаданных TempDB, оптимизированной для памяти, требуется перезагрузка.
В некоторых случаях вы можете наблюдать, как клерк памяти
MEMORYCLERK_XTP
вызывает высокую загрузку памяти, что приводит к ошибкам из-за нехватки памяти в вашей рабочей нагрузке.Чтобы увидеть использование памяти компонентом
MEMORYCLERK_XTP
по сравнению с использованием всеми другими компонентами памяти и в отношении целевого объема памяти сервера, выполните следующий запрос:SELECT SUM(IIF(type = 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS memoryclerk_xtp_pages_mb, SUM(IIF(type <> 'MEMORYCLERK_XTP', pages_kb, NULL)) / 1024. AS other_pages_mb, SUM(committed_target_kb) / 1024. AS committed_target_memory_mb FROM sys.dm_os_memory_clerks CROSS JOIN sys.dm_os_sys_info;
Если уровень загрузки памяти
MEMORYCLERK_XTP
высок, вы можете смягчить проблему следующим образом:- Привязите базу данных
tempdb
к пулу ресурсов, который ограничивает потребление памяти метаданными TempDB, оптимизированными для памяти. Дополнительные сведения см. в разделе Настройка и использование оптимизированных для памяти метаданных tempdb. - Системная хранимая процедура может периодически выполняться для освобождения памяти
MEMORYCLERK_XTP
, которая больше не нужна. Дополнительные сведения см. в разделе sys.sp_xtp_force_gc (Transact-SQL).
Дополнительные сведения см. в разделе метаданных tempdb (HkTempDB), оптимизированных для памяти, об ошибках из-за нехватки памяти.
- Привязите базу данных
При использовании In-Memory OLTPодна транзакция не может получить доступ к таблицам, оптимизированным для памяти, в нескольких базах данных. Из-за этого любая транзакция чтения или записи, которая включает в себя оптимизированную для памяти таблицу в пользовательской базе данных, также не может получить доступ к системным представлениям
tempdb
в той же транзакции. Если это происходит, вы получите ошибку 41317:A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.
Это ограничение также применяется к другим сценариям, когда одна транзакция пытается получить доступ к таблицам, оптимизированным для памяти, в нескольких базах данных.
Например, при запросе представления каталога sys.stats в пользовательской базе данных, содержащей оптимизированные для памяти таблицы, может возникнуть ошибка 41317. Это происходит потому, что запрос пытается получить доступ к статистике данных в таблице, оптимизированной для памяти, в пользовательской базе данных и к метаданным, оптимизированным для памяти, в
tempdb
.В следующем примере скрипта возникает эта ошибка при включении метаданных TempDB, оптимизированных для памяти:
BEGIN TRAN; -- Create an In-memory OLTP transaction that accesses a system view in tempdb SELECT name FROM tempdb.sys.tables; -- An attempt to create an In-memory OLTP transaction in the user database fails INSERT INTO <user database>.<schema>.<memory-optimized table> VALUES (1); COMMIT TRAN;
Примечание.
Это ограничение не применяется к временным таблицам. Временную таблицу можно создать в той же транзакции, которая обращается к таблице, оптимизированной для памяти, в пользовательской базе данных.
Запросы к представлениям системного каталога всегда используют уровень изоляции
READ COMMITTED
. Когда метаданные TempDB с оптимизацией для памяти включены, запросы к представлениям системного каталога вtempdb
используют уровень изоляцииSNAPSHOT
. В любом случае подсказки блокировки не учитываются.Индексы columnstore нельзя создавать во временных таблицах при включении метаданных TempDB, оптимизированных для памяти.
- В результате использование системной хранимой процедуры
sp_estimate_data_compression_savings
с параметром сжатия данныхCOLUMNSTORE
илиCOLUMNSTORE_ARCHIVE
не поддерживается при включении метаданных TempDB, оптимизированных для памяти.
- В результате использование системной хранимой процедуры
Планирование ресурсов для tempdb в SQL Server
Определение подходящего размера для tempdb
зависит от многих факторов. Эти факторы включают рабочую нагрузку и используемые функции ядра СУБД.
Рекомендуем проанализировать потребление пространства tempdb
, выполнив следующие действия в тестовой среде, в которой можно воспроизвести вашу типичную рабочую нагрузку:
- Включите автоматическое увеличение для файлов
tempdb
. Все файлы данныхtempdb
должны иметь одинаковый начальный размер и конфигурацию автоматического увеличения. - Воспроизведите рабочую нагрузку и отслеживайте использование пространства
tempdb
. - Если вы используете периодическое обслуживание индексов , выполните задания по обслуживанию и отслеживайте объем
tempdb
. - Используйте максимальное пространство, используемое на предыдущих шагах, чтобы спрогнозировать общее использование рабочей нагрузки. Скорректируйте полученное значение с учетом предполагаемой параллельной обработки и задайте соответствующий размер
tempdb
.
Мониторинг использования tempdb
Нехватка места на диске в tempdb
может привести к значительным сбоям и простою приложения. Вы можете использовать динамическое представление управления sys.dm_db_file_space_usage для мониторинга пространства, используемого в файлах tempdb
.
Например, следующий пример скрипта находит:
- Свободное место в
tempdb
(не учитывая свободное место на диске, доступное для увеличенияtempdb
) - Пространство, используемое хранилищем версий
- Пространство, используемое внутренними объектами
- Пространство, используемое пользовательскими объектами
SELECT SUM(unallocated_extent_page_count) * 8.0 / 1024 AS tempdb_free_data_space_mb,
SUM(version_store_reserved_page_count) * 8.0 / 1024 AS tempdb_version_store_space_mb,
SUM(internal_object_reserved_page_count) * 8.0 / 1024 AS tempdb_internal_object_space_mb,
SUM(user_object_reserved_page_count) * 8.0 / 1024 AS tempdb_user_object_space_mb
FROM tempdb.sys.dm_db_file_space_usage;
Чтобы отслеживать выделение страниц или действие размещения сделки в tempdb
на уровне сеанса или задачи, можно использовать sys.dm_db_session_space_usage и sys.dm_db_task_space_usage динамические административные представления. Эти представления помогут определить запросы, временные таблицы или переменные таблицы, использующие большие объемы tempdb
пространства.
Например, используйте следующий пример скрипта для получения пространства tempdb
, выделенного и освобожденного внутренними объектами в выполняющихся задачах для каждого сеанса.
SELECT session_id,
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id;
Используйте следующий пример скрипта, чтобы найти tempdb
выделенное и используемое в настоящее время пространство внутренними и пользовательскими объектами для каждого сеанса и запроса, как для выполняющихся, так и для завершенных задач.
WITH tempdb_space_usage AS
(
SELECT session_id,
request_id,
user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
FROM sys.dm_db_task_space_usage
UNION ALL
SELECT session_id,
NULL AS request_id,
user_objects_alloc_page_count + internal_objects_alloc_page_count AS tempdb_allocations_page_count,
user_objects_alloc_page_count + internal_objects_alloc_page_count - user_objects_dealloc_page_count - user_objects_deferred_dealloc_page_count - internal_objects_dealloc_page_count AS tempdb_current_page_count
FROM sys.dm_db_session_space_usage
)
SELECT session_id,
COALESCE(request_id, 0) AS request_id,
SUM(tempdb_allocations_page_count * 8) AS tempdb_allocations_kb,
SUM(IIF (tempdb_current_page_count >= 0, tempdb_current_page_count, 0) * 8) AS tempdb_current_kb
FROM tempdb_space_usage
GROUP BY session_id, COALESCE (request_id, 0)
ORDER BY session_id, request_id;