Планирование размера базы данных tempdb

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

Использование базы данных tempdb

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

Пользовательские объекты

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

  • пользовательские таблицы и индексы

  • системные таблицы и индексы

  • Глобальные временные таблицы и индексы

  • локальные временные таблицы и индексы

  • табличные переменные

  • таблицы, возвращаемые возвращающими табличное значение функциями

Внутренние объекты

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

  • рабочие таблицы для хранения операций с курсором, операций подкачки и временных больших объектов (LOB);

  • рабочие файлы для операций хэш-соединения или статистических хэш-выражений;

  • промежуточные результаты сортировки при таких операциях, как создание или перестроение индексов (если указан параметр SORT_IN_TEMPDB), либо определенных запросах GROUP BY, ORDER BY или UNION.

Каждый внутренний объект использует минимум девять страниц: одну IAM-страницу и один восьмистраничный экстент. Дополнительные сведения о страницах и экстентах см. в разделе Страницы и экстенты.

Хранилища версий

Хранилище версий — это коллекция страниц данных, содержащих строки данных, которые необходимы для поддержки возможностей, применяющих управление версиями строк. Существует два хранилища версий: общее хранилище версий и хранилище версий построения индексов в сети. Хранилища версий содержат следующее:

  • версии строк, сформированных транзакциями изменения данных в базе данных, которая использует уровни изоляции моментальных снимков или зафиксированного чтения при использовании управления версиями строк;

  • версии строк, сформированных транзакциями изменения данных для следующих операций: операций с индексами в сети, множественных активных результирующих наборов (режим MARS) и триггеров AFTER.

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

Возможность

Использование базы данных tempdb

Дополнительные сведения

Операции массовой загрузки с триггерами включены

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

Оптимизация производительности массового импорта данных

Запросы обобщенных табличных выражений

Обобщенные табличные выражения могут рассматриваться как временные результирующие наборы, определенные в области выполнения одиночных инструкций SELECT, INSERT, UPDATE, DELETE и CREATE VIEW.

Когда в плане запроса для обобщенного табличного выражения для сохранения промежуточных результатов используется оператор буферизации, ядро СУБД создает рабочую таблицу в базе данных tempdb для поддержки этой операции.

Применение обобщенных табличных выражений

WITH обобщенное_табличное_выражение (Transact-SQL)

Курсоры

Управляемые набором ключей и статические курсоры используют рабочие таблицы, встроенные в базу данных tempdb. Управляемые набором ключей курсоры используют рабочую таблицу для хранения набора ключей, который идентифицирует строки в курсоре. Статические курсоры используют рабочую таблицу для хранения полного результирующего набора курсора.

Использование места на диске курсорами может изменяться в зависимости от выбранного плана запроса. Если план запроса такой, как в предыдущих версиях SQL Server, выделяется примерно столько же места на диске.

О выборе типа курсора

Компонент Database Mail

См. раздел «Компонент Service Broker» далее в этой таблице.

Компонент Database Mail

DBCC CHECKDB

Команда DBCC CHECKDB использует рабочие таблицы базы данных tempdb для хранения промежуточных результатов и сортировки.

Чтобы определить место на диске, необходимое базе данных tempdb для этой операции, выполните команду DBCC CHECKDB WITH ESTIMATEONLY.

DBCC CHECKDB (Transact-SQL)

Оптимизация производительности инструкции DBCC CHECKDB

Уведомления о событиях

См. раздел «Компонент Service Broker» далее в этой таблице.

Основные сведения уведомлений о событиях

Индексы

При создании или перестроении (режиме в сети или вне сети) индекса можно присвоить параметру SORT_IN_TEMPDB значение ON, чтобы указать компоненту Database Engine базу данных tempdb для хранения промежуточных результатов сортировки, которые используются при построении индекса. Если указан параметр SORT_IN_TEMPDB и необходимо выполнить сортировку, база данных tempdb должна иметь достаточно места на диске для хранения наибольшего индекса, к которому следует добавить место, равное значению параметра index create memory. Дополнительные сведения см. в разделе Пример места на диске для индекса.

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

Для операций с индексами в сети применяется управление версиями строк, позволяющее изолировать действия с индексами от воздействия изменений, внесенных другими транзакциями. Управление версиями строк позволяет не запрашивать общую блокировку уже считанных строк. Одновременное обновление и удаление, выполняемое пользователями во время операций с индексами в сети, требует для записей версий места в базе данных tempdb. Если в операциях в сети с индексами используется параметр SORT_IN_TEMPDB и необходима сортировка, база данных tempdb должна иметь дополнительное место на диске для хранения промежуточных результатов сортировки. Операциям с индексами в сети, создающим, удаляющим или перестраивающим кластеризованный индекс, также необходимо дополнительное место на диске для построения и обслуживания временного индекса сопоставления. Операции CREATE и UPDATE STATISTICS могут использовать базу данных tempdb для сортировки образцов строк для построения статистики. Дополнительные сведения см. в разделе Требования к месту на диске для DDL-операций индекса.

База данных tempdb и создание индекса

Дополнительные рекомендации по секционированным индексам

Требования к месту на диске для DDL-операций индекса

Пример места на диске для индекса

О фоновых операциях с индексом

Переменные и параметры типа данных больших объектов (LOB)

Типы данных больших объектов: varchar(max), nvarchar(max), varbinary(max)text, ntext, image и xml. Эти типы могут иметь размер до 2 ГБ и их можно использовать в качестве переменных или параметров в хранимых процедурах, определяемых пользователями функциях, пакетах и запросах. Параметры и переменные, определенные как тип данных LOB, используют для хранения основную память, если значения небольшие. Однако крупные значения хранятся в базе данных tempdb. При хранении в базе данных tempdb переменные и параметры LOB рассматриваются как внутренние объекты. Чтобы получить сведения о страницах, выделенных внутренним объектам в текущем сеансе, можно выполнить запрос к динамическому административному представлению sys.dm_db_session_space_usage.

Некоторые встроенные строковые функции, такие как SUBSTRING или REPLICATE, могут требовать промежуточного временного хранения в базе данных tempdb при работе со значениями типа LOB. Кроме того, если в базе данных активирован уровень изоляции транзакций на основе версий строк и в крупных объектах сделаны изменения, измененный фрагмент типа LOB копируется в хранилище версий базы данных tempdb.

Использование типов данных больших значений

Режим MARS

На одном соединения может быть несколько активных результирующих наборов результатов (так называемый режим MARS). Если во время сеанса MARS выполняется инструкция изменения данных (например INSERT, UPDATE или DELETE) в момент, когда есть активный результирующий набор, строки, которых коснулось изменение, сохраняются в хранилище версий базы данных tempdb. См. раздел «Управление версиями строк» далее в этой таблице.

Использование режима MARS

Уведомления запросов

См. раздел «Компонент Service Broker» далее в этой таблице.

Использование уведомлений запросов

Запросы

Запросы, содержащие инструкции SELECT, INSERT, UPDATE и DELETE, могут использовать внутренние объекты для хранения промежуточных результатов операций хэш-соединений, статистических хэш-выражений или сортировки.

Когда кэшируется план выполнения запроса, кэшируются и необходимые рабочие таблицы. Если кэшируется рабочая таблица, она усекается и в кэше остается девять страниц для повторного использования. Это повышает производительность следующего выполнения запроса. При нехватке памяти компонент Database Engine может удалить план выполнения и связанные рабочие таблицы.

Кэширование и повторное использование плана выполнения

Управление версиями строк

Управление версиями строк — это стандартная структура, используемая для поддержки следующих функций:

  • Триггеры

  • Режим MARS

  • Операции с индексами, в которых указан параметр ONLINE

  • Уровни изоляции транзакций, основанные на управлении версиями строк.

    • Новая реализация уровня изоляции зафиксированного чтения, которая использует управление версиями строк для обеспечения согласованности считывания на уровне инструкций.

    • Уровень изоляции моментального снимка для обеспечения согласованности считывания на уровне транзакций.

Версии строк хранятся в хранилище версий базы данных tempdb в течение времени, когда активная транзакция должна обращаться к ним. Содержимое текущего хранилища версий возвращается представлением sys.dm_tran_version_store. Страницы хранилища версий отслеживаются на файловом уровне, поскольку они являются глобальными ресурсами. Для просмотра текущего размера хранилища версий можно использовать столбец version_store_reserved_page_count из представления sys.dm_db_file_space_usage. При очистке хранилища версий необходимо рассмотреть наиболее долго выполняющуюся транзакцию, которой нужен доступ к определенной версии. Наиболее долго выполняющаяся транзакция, связанная с очисткой хранилища версий, может быть найдена путем просмотра столбца elapsed_time_seconds в представлении sys.dm_tran_active_snapshot_database_transactions. Счетчики Свободное место в базе данных Tempdb (КБ) и Размер хранилища версий (КБ) объекта Транзакции можно использовать для отслеживания размера и темпов роста хранилища версий строк в базе данных tempdb. Дополнительные сведения см. в разделе SQL Server, объект Transactions.

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

Основная формула для расчетов:

[Size of Version Store] = 2 *

[Version store data generated per minute] *

[Longest running time (minutes) of your transaction]

Основные сведения об уровнях изоляции на основе управления версиями строк

Использование ресурсов при управлении версиями строк

Service Broker

Компонент Service Broker помогает создавать асинхронные слабосвязанные приложения, в которых независимые компоненты совместно выполняют ту или иную задачу. Эти компоненты приложений обмениваются сообщениями, которые содержат сведения, необходимые для выполнения задачи. Компонент Service Broker явно использует базу данных tempdb для сохранения текущего диалогового контекста, который не может содержаться в памяти. Необходимый размер — примерно 1 КБ на диалог.

Кроме того, компонент Service Broker неявно использует базу данных tempdb при фиксации объектов в контексте выполнения запроса, например рабочих таблиц, которые используются в событиях таймера и фоновых доставляемых диалогах.

Компоненты Database Mail, Event Notifications и Query Notifications неявно используют компонент Service Broker.

Общие сведения (компонент Service Broker)

Хранимые процедуры

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

Создание хранимых процедур (компонент Database Engine)

Временные таблицы и переменные table

  • Пользовательские таблицы и индексы

  • Системные таблицы и индексы

  • Глобальные временные таблицы и индексы

  • Локальные временные таблицы и индексы

  • Переменные table

  • Таблицы, возвращаемые в возвращающих табличное значение функциях

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

Переменная table ведет себя как локальная переменная. Переменная table имеет тип table и используется в первую очередь для временного хранения набора строк, возвращаемых как результирующий набор возвращающей табличное значение функции. Место на диске для хранения переменной table зависит от размера объявленной переменной и хранимого в ней значения.

Локальные временные таблицы и переменные кэшируются, если выполняются следующие условия.

  • Именованные ограничения не созданы.

  • Инструкции DDL, относящиеся к таблице, например CREATE INDEX или CREATE STATISTICS, не запускались после создания временной таблицы.

  • Временный объект не создан с помощью динамического SQL, к примеру: sp_executesql N'create table #t(a int)'.

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

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

Для оптимизации производительности следует вычислить место на диске, необходимое для кэшируемых локальных временных таблиц или переменных типа table в базе данных tempdb с помощью следующей формулы:

9 page per temp table

* number of average temp tables per procedure

* number of maximum simultaneous executions of the procedure

Инструкция CREATE TABLE (Transact-SQL)

Использование переменных и параметров (компонент Database Engine)

DECLARE @local_variable (Transact-SQL)

Триггеры

Таблицы inserted и deleted, используемые в триггерах AFTER, создаются в базе данных tempdb. Т.е. версии строк, которые обновляются и удаляются триггером, управляются. Это относится ко всем строкам, которые изменяются инструкцией, вызывающей срабатывание триггера. Версии строк, которые вставляются триггером, не управляются.

Триггеры INSTEAD OF и запросы используют базу данных tempdb похожим способом. Для триггеров INSTEAD OF требуется столько же места на диске, как и в предыдущих версиях SQL Server. См. раздел «Запросы» выше в этой таблице.

При массовой загрузке данных с включенными триггерами копия каждой удаленной или обновленной строки добавляется в хранилище версий.

CREATE TRIGGER (Transact-SQL)

Оптимизация производительности массового импорта данных

Использование ресурсов при управлении версиями строк

Определенные пользователем функции

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

Типы данных, разрешенные для параметров, а также для возвращаемых значений скалярных и табличных функций, включают большинство типов данных LOB. Например, возвращаемое значение может иметь тип xml или varchar(max). См. раздел «Переменные и параметры типа данных больших объектов» выше в этой таблице.

Временные объекты определяемых пользователем функций, возвращающих табличное значение, могут кэшироваться для оптимизации операций, связанных с удалением и созданием этих объектов. См. раздел «Временные таблицы и переменные table» выше в этой таблице.

CREATE FUNCTION (Transact-SQL)

XML

Переменные и параметры типа xml могут иметь размер до 2 ГБ. Для хранения они используют основную память, если значения небольшие. Однако крупные значения хранятся в базе данных tempdb. См. раздел «Переменные и параметры типа данных больших объектов» выше в этой таблице.

Системная хранимая процедура sp_xml_preparedocument создает рабочую таблицу в базе данных tempdb. Средство синтаксического анализа MSXML использует эту временную таблицу для хранения XML-документов, прошедших анализ. Базе данных tempdb требуется примерно столько места на диске, каков размер указанного XML-документа, при выполнении хранимой процедуры.

Реализация языка XML в SQL Server

sp_xml_preparedocument (Transact-SQL)

Запросы XML с использованием OPENXML

Планирование размера дискового пространства, необходимого для обновления до уровня SQL Server

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

  1. Установите автоувеличение для базы данных tempdb.

  2. Запустите отдельные запросы или файлы трассировки рабочей нагрузки и следите за использованием диска базой данных tempdb.

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

  4. Используйте сведения об используемом месте из предыдущих шагов для прогнозирования общей рабочей нагрузки, скорректируйте полученное значение с учетом планируемой параллельной обработки и задайте соответствующий размер базы данных tempdb.

Дополнительные сведения о мониторинге использования места на диске базой данных tempdb см. в разделе Устранение неполадок, связанных с нехваткой места на диске для базы данных tempdb. Дополнительные сведения об оценке использования базы данных tempdb для операций с индексами см. в разделе Пример места на диске для индекса.

Настройка базы данных tempdb в рабочих средах

Чтобы оптимизировать использование базы данных tempdb, соблюдайте требования и рекомендации из раздела Оптимизация производительности базы данных tempdb.

Мониторинг использования базы данных tempdb

Нехватка места на диске для базы данных tempdb может привести к существенным сбоям рабочей среды SQL Server и помешать работающим приложениям завершить операции. Для контроля места на диске, используемого указанными функциями в файлах базы данных tempdb, можно использовать динамическое административное представление sys.dm_db_file_space_usage Кроме того, для контроля деятельности по выделению и освобождению страниц в базе данных tempdb на уровне сеанса или задачи можно использовать динамические административные представления sys.dm_db_session_space_usage и sys.dm_db_task_space_usage. Эти представления могут быть использованы для определения больших запросов, временных таблиц или табличных переменных, которые используют много места на диске базы данных tempdb. Также предусмотрено несколько соответствующих счетчиков, которые можно использовать для отслеживания свободного места в базе данных tempdb и ресурсов, использующих базу данных tempdb. Дополнительные сведения см. в разделе Устранение неполадок, связанных с нехваткой места на диске для базы данных tempdb.