29.10.2019

Флаги трассировки для работы с MS SQL Server

Флаги трассировки Microsoft SQL Server, рекомендуемые к использованию для работы с платформой 1С:Предприятие

Что такое флаги трассировки Microsoft SQL Server?

Как сказано в документации Microsoft https://msdn.microsoft.com/ru-ru/library/ms188396(v=sql.120).aspx, "флаги трассировки используются для временной установки определенных характеристик сервера или отключения определенного режима. ... Флаги трассировки часто используются для диагностики проблем, связанных с производительностью. "  Говоря более простым языком, флаги трассировки изменяют стандартное для версии ядра СУБД поведение при выполнении определенных операций. 

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

Установить или снять флаги трассировки можно одним из следующих способов:

DBCC TRACEON ([n - номер флага], [, -1 - глобально]) 

- для того, чтобы включить флаг https://msdn.microsoft.com/ru-ru/library/ms187329(v=sql.120).aspx

 

DBCC TRACEOFF ([n - номер флага], [, -1 - глобально])

- для того, что выключить флаг https://msdn.microsoft.com/ru-ru/library/ms174401(v=sql.120).aspx.

 

Проверить, какие флаги установлены для сеанса и сервера, можно с помощью команды:

DBCC TRACESTATUS 

 

Подробная инструкция по настройке параметров запуска приведена в документации  https://msdn.microsoft.com/ru-ru/library/ms345416(v=sql.120).aspx.

 

 

Флаги трассировки, рекомендуемые для работы Microsoft SQL Server с платформой 1С:Предприятие

Для работы с платформой 1С:Предприятие мы рекомендуем всегда включать на глобальном уровне следующие флаги:

При включении этого флага логирование операций массовой вставки данных (например, insert ... select  / select ... into / bulk insert) в индексированные таблицы осуществляется на минимально необходимом уровне: в лог транзакций записывается информация об изменениях лишь на уровне экстентов и метаданных, а не строк. Поскольку запись в лог производится последовательно, это положительно сказывается на возможности параллельной работы и её скорости. 

Флаг применим к версиям Microsoft SQL Server 2005 и старше, в версии 2016 поведение является стандартным, флаг не имеет действия.

Описание флага на официальной странице: https://msdn.microsoft.com/library/dd425070.aspx

При включении флага рост файлов в одной файловой группе будет происходить одновременно. В контексте работы платформы 1С:Предприятие это применимо для базы данных tempdb (файловые группы при работе с пользовательскими базами данных платформой не используются).

Флаг применим к версиям Microsoft SQL Server 2000 и выше. Начиная с версии MS SQL 2016, за это поведение отвечают параметры AUTOGROW_SINGLE_FILE and AUTOGROW_ALL_FILES базы данных. Для  tempdb они включены по умолчанию, а флаг трассировки 1117 не имеет действия. Более подробно о параметрах MS SQL, связанных с файлами и файловыми группами, можно прочитать https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options

Описание флага на официальной странице: https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql

Включение данного флага запрещает размещение страниц разных объектов в одном экстенте. Без данного флага при размещении таблиц размером менее 64 Кб (т.е. менее 8 страниц / 1 экстента) они будут расположены в одном смешанном экстенте, и при увеличении какой-либо из них до размера, превышающего 64 Кб, ее необходимо будет переместить для хранения в однородном экстенте, что потребует ресурсов и может приводить к блокировкам, особенно в контексте базы данных tempdb. Подробнее об этих эффектах можно прочитать в статье службы поддежки Microsoft: https://support.microsoft.com/en-us/help/328551/concurrency-enhancements-for-the-tempdb-database, также https://blogs.msdn.microsoft.com/psssql/2008/12/17/sql-server-2005-and-2008-trace-flag-1118-t1118-usage/.

Флаг применим к версиям Microsoft SQL Server 2000 и выше. Начиная с версии Microsoft SQL 2016, для временных объектов базы данных tempbd выделение осуществляется только экстентами, для остальных баз данных поведение регулируется параметром mixed_page_allocation, флаг 1118 не имеет действия.

Описание флага на официальной странице: https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql.

Флаг отключает эскалацию (укрупнение) блокировок во всех случаях, т.е. как по достижению их предельного количества, так и предельного размера памяти, занятой для хранения информации о них в соответствии с настройками SQL Server. 

Флаг отключает эскалацию (укрупнение) блокировок только по достижению их предельного количества. Имеет более низкий приоритет по сравнению с флагом 1211. 

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

Флаги применимы к версиям Microsoft SQL Server 2000 и выше.

Описание флагов 1211 и 1224 на официальной странице:https://msdn.microsoft.com/ru-ru/library/ms188396(v=sql.120).aspx

Недокументированный флаг отключает сбор статистики использования индексов. При выключенном флаге её данные можно получить из DMV sys.dm_db_index_usage_stats, они используются СУБД  для анализа отсутствующих индексов. При высокой нагрузке рост объёма статистических данных может негативно сказываться на скорости работы оптимизатора, поэтому в продуктивной зоне лучше отключить их сбор, включив флаг 2330. В случае необходимости сбора статических данных об использовании индексов для анализа мы рекомендуем делать это в подготовительной и тестовой зонах.

Флаг применим к версиям Microsoft SQL Server 2005 и выше.

Важный флаг, корректирующий правила определения необходимости автообновлении статистики. При его включении с ростом количества записей в таблице пропорционально уменьшается пороговое значение доли строк, при изменении которых необходимо провести обновление. Подробнее можно прочитать в статье службы поддержки Microsoft https://support.microsoft.com/en-us/help/2754171/controlling-autostat-auto-update-statistics-behavior-in-sql-server. Начиная с версии Microsoft SQL Server 2016, данное поведение определяется компонентом Database Engine, флаг не имеет действия.

Флаг применим к версиям Microsoft SQL Server 2008 R2 Service Pack 1 и выше.

Описание на официальной странице: https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql

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

Флаг может быть применен к версиям Microsoft SQL Server 2005 Service Pack 3 и выше. В версии 2016 изменения могут быть применены автоматически без необходимости включения флага в зависимости от режима совместимости базы данных (COMPATIBILITY_LEVEL), более подробно о назначении и применении флага можно прочитать в статье службы поддержки https://support.microsoft.com/en-us/help/974006/sql-server-query-optimizer-hotfix-trace-flag-4199-servicing-model.

Описание на официальной странице: https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql

Флаг преобразует глобальные объекты памяти, где хранится в том числе информация о статистике, в секционированные и тем самым позволяет избежать ожиданий на их блокировках (вид ожиданий CMEMTHREAD) при частых компиляциях и перекомпиляциях планов запросов в многопроцессорных системах. Подробнее о флаге можно прочитать в статье службы поддержки https://support.microsoft.com/en-us/help/3074425/fix-cmemthread-waits-occur-when-you-execute-many-ad-hoc-queries-in-sql.

Флаг применим к версиям Microsoft SQL Server 2008 и выше. Начиная с версии Microsoft SQL Server 2014 Service Pack 2 и Microsoft SQL Server 2016, поведение является стандартными.

Описание на официальной странице: https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql