Skip to content

Как включать флаги трассировки SQL Server

Пересказ статьи Robert Sheldon. How to enable SQL Server trace flags


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


Введение в флаги трассировки SQL Server


Вы можете вручную включать или выключать флаги трассировки, а можете добавить их в параметры запуска SQL Server, чтобы они включались при каждом запуске службы. Флаги трассировки могут включаться на глобальном, сессионном уровне или на уровне запроса, в зависимости от конкретного флага трассировки. Область действия определяет степень влияния флага трассировки на соединения с сервером:

  • Глобальные флаги трассировки включаются на уровне сервера и влияют на каждое соединение с сервером. Флаги трассировки, конфигурируемые как параметры запуска, всегда включены на глобальном уровне.

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

  • Флаги трассировки уровня запроса имеют отношение к запросу, в котором они включены. Они не влияют на другие запросы даже в пределах той же самой сессии.


Когда вы включаете флаг трассировки вручную, вы должны выбрать конкретную область действия. Некоторые флаги трассировки доступны для всех трех областей, в то время как другие ограничены одной или двумя.

Вы можете обратиться к документации на SQL Server, которая относится только к двум типам флагов трассировки - глобальному и сессионному - опуская обсуждение флагов трассировки уровня запроса. Способ, которым SQL Server Management Studio (SSMS) ссылается на флаги трассировки запросов в планах выполнения, также предполагает только два типа флагов трассировки, как вы увидите позже в этой статье. Однако флаги трассировки запросов существуют, но их включение сильно отличается от глобальных и сессионных флагов трассировки.

SQL Server поддерживает широкий диапазон флагов трассировки, каждый из которых имеет номер. Многие из них документированы, но далеко не все. Microsoft полностью поддерживает документированные флаги трассировки, когда они используются в промышленной среде. Также поддерживаются рекомендованные службой поддержки Microsoft. Вы можете узнать о документированных флагах трассировки в следующей статье из справки на T-SQL: DBCC TRACEON – Trace Flags. За информацией о недокументированных флагах трассировки вам следует обратиться к сообществу SQL Server, чтобы узнать, что скажут другие разработчики и администраторы баз данных.

Прежде чем включить флаг трассировки, вам следует четко понимать, что он делает, как он работает, и какое потенциальное воздействие он может оказать на вашу систему. Например, флаг трассировки 7470 включает дополнительные вычисления для грантов памяти, требуемой операторами сортировки. Если вы захотите просмотреть подробную информацию об этом флаге трассировки в DBCC TRACEON – Trace Flags, то обнаружите, что он поддерживает все три уровня охвата, но применим только к конкретным версиям SQL Server. Вы найдете там же ссылку на относящуюся к теме статью службы поддержки Microsoft, а также предупреждение о влиянии на память для конкурирующих запросов.

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

Работа с глобальными флагами трассировки


SQL Server предоставляет несколько операторов T-SQL для работы с глобальными и сессионными флагами трассировки. Для демонстрации работы этих операторов давайте начнем с глобальных флагов трассировки.

Как уже отмечалось, вы можете включить глобальный флаг трассировки вручную или посредством конфигурирования параметров запуска сервера. Вы можете использовать оператор DBCC TRACEON для включения его вручную, указывая номер флага трассировки и аргумент -1, говорящий о том, что флаг трассировки является глобальным. Например, следующий оператор DBCC TRACEON включает флаг трассировки 2301 на глобальном уровне:

DBCC TRACEON (2301, -1);
GO

Флаг трассировки 2301 реализует расширенную оптимизацию, которая помогает ускорить выполнение запросов в системе поддержки принятия решений для больших наборов данных. Когда вы выполните этот оператор, ядро базы данных вернет сообщение, показанное на Рис.1 (но с соответствующей временной меткой).


Рис.1. Стандартное сообщение, возвращаемое DBCC TRACEON

Если вы хотите, чтобы оператор вернул только основное сообщение (а не информацию об ошибках), вы можете добавить опцию WITH NO_INFOMSGS:

DBCC TRACEON (2301, -1) WITH NO_INFOMSGS;
GO

Теперь сообщение будет выглядеть так, как показано на рис.2.


Рис.2. Упрощенное сообщение, возвращаемое DBCC TRACEON

Вне зависимости от опции WITH NO_INFOMSGS вам следует использовать DBCC TRACEON только тогда, когда пользователи и приложения одновременно не выполняют запросы к платформе.

После включения флага трассировки вы можете проверить его состояние, выполнив оператор DBCC TRACESTATUS, указав номер флага трассировки и значение -1, говорящее о глобальном уровне флага, что показано в следующем примере:

DBCC TRACESTATUS (2301, -1);
GO

Этот оператор возвращает результаты, показанные на рис.3.


Рис.3. Проверка состояния глобального флага трассировки

Результаты, возвращаемые оператором DBCC TRACESTATUS, содержат 4 столбца:

  • TraceFlag. Номер флага трассировки.

  • Status. Если 1, флаг трассировки включен. Если 0, флаг трассировки выключен.

  • Global. Если 1, флаг трассировки включен на глобальном уровне. Если 0, флаг трассировки не включен на глобальном уровне.

  • Session. Если 1, флаг трассировки включен на уровне сессии. Если 0, флаг трассировки не включен на уровне сессии.


Как и в случае оператора DBCC TRACEON, вы можете также добавить опцию WITH NO_INFOMSGS в оператор DBCC TRACESTATUS, чтобы вернуть упрощенное сообщение.

Чтобы выключить флаг трассировки на глобальном уровне, вы можете использовать оператор DBCC TRACEOFF, указывая опять номер флага трассировки и значение -1, как обозначение глобальности флага трассировки, что показано на следующем примере:

DBCC TRACEOFF (2301, -1);
GO

Убедитесь, что вы добавили аргумент -1, иначе флаг трассировки останется включенным. Для проверки отключения флага трассировки вы можете выполнить тот же самый оператор DBCC TRACESTATUS, который мы использовали ранее:

DBCC TRACESTATUS (2301, -1);
GO

Теперь все столбцы Status, Global и Session должны показать значение 0.

Как и в случае с операторами DBCC TRACEON и DBCC TRACESTATUS, вы можете также добавить опцию WITH NO_INFOMSGS к оператору DBCC TRACEOFF, чтобы упростить сообщение.

В некоторых случаях вы можете захотеть включить несколько флагов одновременно. И здесь вы можете использовать единственный оператор DBCC TRACEON. Например, следующий оператор включает флаги 715 и 2301 на глобальной уровне:

DBCC TRACEON (715, 2301, -1);
GO

Затем вы можете проверить состояние флагов трассировки тем же способом:

DBCC TRACESTATUS (715, 2301, -1);
GO

Теперь оператор DBCC TRACESTATUS возвращает две строки, по одной на каждый заданный флаг, как это показано на рис.4.


Рис.4. Просмотр состояния нескольких флагов трассировки

Вы можете применить тот же подход к отключению двух флагов трассировки:

DBCC TRACEOFF (715, 2301, -1);
GO

И снова вы можете проверить, что флаги трассировки были выключены, выполнив оператор DBCC TRACESTATUS.

Когда вы используете оператор DBCC TRACEON, чтобы включить флаги трассировки на глобальном уровне, они остаются включенными до тех пор, пока вы вручную не выключите их, или пока служба SQL Server не будет перезапущена. Однако вы можете пожелать, чтобы флаг трассировки включался автоматически при перезапуске службы. В этом случае вы можете добавить флаг трассировки в качестве параметра, используя переключатель -Т и указывая номер флага трассировки, как это сделано в следующем примере:

-T 2301
Чтобы добавить флаг трассировки в качестве параметра запуска, вы можете использовать SQL Server Configuration Manager, выполнив следующие шаги:

  1. Запустить SQL Server Configuration Manager.

  2. Проверить, что в левой панели выбрано SQL Server Services

  3. В правой панели щелкните правой кнопкой на экземпляре службы SQL Server, а затем на Properties (свойства).

  4. Перейдите на вкладку Startup Parameters (параметры запуска).

  5. В текстовой области напечатайте команду переключения -T, а затем щелкните Add (добавить). Параметр добавляется в список имеющихся параметров (Existing parameters), как показано на рис.5.

  6. 6. Щелкните ОК.



Рис.5. Добавление флага трассировки к параметрам запуска

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

Если вы хотите удалить флаг трассировки из параметров запуска, выберите его в списке Existing parameters, щелкните Remove (удалить) и ОК. Вы снова должны перезапустить службу, чтобы изменения вступили в силу.

Работа с сессионными флагами трассировки


Действия по включению и выключению сессионных флагов трассировки подобна действиям с глобальными флагами трассировки, за исключением двух заметных отличий. Вы не можете добавить сессионный флаг трассировки в качестве параметра запуска, и вы не добавляете аргумент -1 при выполнении операторов DBCC TRACEON и DBCC TRACEOFF. Например, для включения флага трассировки 2301 на уровне сессии вы можете использовать следующий оператор DBCC TRACEON:

DBCC TRACEON (2301);  
GO

Как видно, вам нужно указать только номер флага трассировки. То же самое справедливо для проверки состояния флага трассировки:

DBCC TRACESTATUS (2301);  
GO

Оператор TRACESTATUS должен теперь вернуть для Global значение 0, а для Session - 1, в противоположность глобальному флагу трассировки, что показано на рис.6.


Рис.6. Просмотри состояния сессионного флага трассировки

Поскольку флаг трассировки был включен на сессионном уровне, он доступен только в текущем подключении и до тех пор, пока существует сессия. Если вы выполните тот же оператор DBCC TRACESTATUS из другой сессии, каждый из столбцов Status, Global и Session будет содержать значение 0.

Чтобы выключить флаг трассировки на уровне сессии, вы можете выполнить оператор DBCC TRACEOFF в том же подключении, в котором флаг трассировки был включен, например:

DBCC TRACEOFF (2301);
GO

Как и прежде, вы можете проверить состояние флага трассировки с помощью оператора DBCC TRACESTATUS, который теперь должен вернуть значение 0 в столбцах Status, Global и Session.

Работа с флагами трассировки запроса


Подход, применяемый к флагам трассировки запроса, отличается от глобального и сессионного флагов трассировки. Вы используете не операторы T-SQL, которые вы видели ранее, а добавляете в ваши операторы хинт запроса QUERYTRACEON. Хинт запроса ограничен флагами трассировки оптимизатора запросов, представляющих собой малую толику документированных флагов трассировки.

Чтобы продемонстрировать флаги трассировки запроса, давайте начнем с включения нескольких глобальных и сессионных флагов, которые мы будем использовать в целях сравнения. Следующие операторы DBCC TRACEON включают два глобальных флага трассировки (692 и 715) и один сессионный флаг (2301):

DBCC TRACEON (692, 715, -1);  
GO
DBCC TRACEON (2301);
GO

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

Если вы принимаете этот подход, имейте в виду, что не всегда ясно, использовать ли аргумент -1. Согласно документации на SQL Server, выполнение оператора DBCC TRACESTATUS без какого-либо аргумента возраращает "все флаги трассировки, которые включены для текущей сессии". С другой стороны, добавление аргумента -1 возвращает "все флаги трассировки, которые включены в настоящее время на глобальном уровне". Но если вы выполните вместе следующие операторы, то сразу увидите, что результаты не соответствуют документации:

DBCC TRACESTATUS ();  
GO
DBCC TRACESTATUS (-1);
GO

На рис.7 показаны результаты, возвращаемые этими двумя операторами. Как видно, операторы генерируют идентичные результаты. Опуская аргумент, получаем флаги трассировки, включенные на глобальном уровне, а добавляя его, получаем флаги трассировки, включенные на сессионном уровне. Судя по всему, нет большой разницы, использовать или нет аргумент -1.


Рис.7. Выполнение базовых операторов TRACESTATUS

После выполнения большого числа операторов DBCC TRACESTATUS, с аргументом -1 или без него, я не смог обнаружить какой-либо разницы в результатах. И, видимо, я не одинок в своих наблюдениях. Согласно статье Jason Brimhalls Capture the Flag – The Trace Flag, "Параметр -1 не возвращает соответствующий результирующий набор, и это воспроизводится... Использование этого параметра все еще так же возвращает сессионные флаги." Я оставляю на ваше усмотрение, какому подходу следовать.

А пока давайте вернемся к флагу трассировки запроса, и как использовать хинт запроса QUERYTRACEON. Следующий оператор SELECT запрашивает данные из экспериментальной базы данных WideWorldImporters:

USE WideWorldImporters;
GO
SELECT so.OrderDate, sol.StockItemID, sol.Description,
SUM(sol.UnitPrice * sol.Quantity) AS Total
FROM Sales.OrderLines sol INNER JOIN Sales.Orders so
ON sol.OrderID = so.OrderID
GROUP BY so.OrderDate, sol.StockItemID, sol.Description
OPTION (QUERYTRACEON 1211);

Этот оператор содержит предложение OPTION, которое вводит хинт запроса QUERYTRACEON с указанием флага трассировки 1211. Если выполнить этот оператор SELECT в SSMS, вы сможете использовать возможность вывода фактического плана выполнения (Actual Execution Plan), чтобы проверить, что флаг трассировки применялся к запросу.

После выполнения оператора перейдите на вкладку Execution plan (план выполнения), щелкните правой кнопкой на элементе SELECT, а затем щелкните Properties (свойства). На панели Properties разверните узел TraceFlags (флаги трассировки), чтобы увидеть флаги трассировки, которые включались при выполнении вами оператора SELECT. Вы должны увидеть информацию, подобную той, которая показана на рис.8 (очерчено красным).


Рис.8. Просмотр флагов трассировки в плане выполнения

Как ожидалось, флаги трассировки 692 и 715 показывают глобальный уровень действия, а флаг 2301 - сессионный. Флаг трассировки 1211 также показывает сессионный уровень, несмотря на то, что он был развернут как флаг трассировки запроса. Чтобы проверить это, вы можете выполнить следующий оператор DBCC TRACESTATUS:

DBCC TRACESTATUS (1211);
GO

Если выполнить этот оператор, каждый столбец Status, Global и Session должен показать значение 0, означающее, что 1211 не включался как глобальный или сессионный флаг трассировки.

Несмотря на терминологию интерфейса, видимо, флаг трассировки 1211 был внедрен на уровне запроса; это означает, что он не оказывает влияния вне самого оператора SELECT. Вы можете это проверить еще раз выполнить запрос SELECT, но уже без предложения OPTION. Теперь флаг трассировки не должен показываться в плане выполнения.

Между тем, другие флаги трассировки по-прежнему включены, но вы можете их отключить с помощью следующих операторов DBCC TRACEOFF.

DBCC TRACEOFF (692, 715, -1);  
GO
DBCC TRACEOFF (2301);
GO

Как и в случае других флагов трассировки, вы также можете выполнить оператор DBCC TRACESTATUS для проверки, что флаги трассировки были отключены. Если нет никаких включенных флагов, вы получите сгенерированное DBCC сообщение о том, что выполнение завершено.

Флаги трассировки SQL Server


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

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.