По умолчанию это исправление включено в пакет обновления 1 для SQL Server 2014 и пакет обновления 3 (SP3) для SQL Server 2012, и вам не нужно добавлять флаги трассировки, чтобы включить исправление. Чтобы включить исправление после установки одного из накопительных пакетов обновления в разделе "Решение", необходимо запустить Microsoft SQL Server, добавив флаг трассировки 1236 в параметры запуска.
Проблема
Предположим, что вы запустили экземпляр Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 или SQL Server 2008 R2 на компьютере с большим количеством процессоров. Если количество блокировок (тип ресурса = DATABASE) для определенной базы данных превышает определенное пороговое значение, возникают следующие проблемы с производительностью:
Повышенные значения возникают при LOCK_HASH счетчике блокировок "Вращение".
Примечание. Сведения о том, как отслеживать этот цикл-блокировку, см. в разделе "Дополнительные сведения".
Запросы или операции, требующие блокировки базы данных, занимают много времени. Например, вы можете заметить следующие задержки производительности:
- Данные для входа в SQL Server
- Запросы к связанному серверу
- sp_reset_connection
- Транзакции
Примечание. Чтобы найти список блокировок (тип ресурса = DATABASE) в данной базе данных, см. раздел "Дополнительные сведения". Пороговое значение зависит от среды.
Решение
Сведения о накопительном пакете обновления
Эта проблема была впервые исправлена в следующем накопительном пакете обновления SQL Server.
Накопительный пакет обновления 13 для SQL Server 2008 R2 с пакетом обновления 2 (SP2) /en-us/help/2967540
Накопительный пакет обновления 17 для SQL Server 2008 SP3 /en-us/help/2958696
Накопительный пакет обновления 1 для SQL Server 2014 г. /en-us/help/2931693
Накопительный пакет обновления 9 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2931078
Сведения о накопительных обновлениях для SQL Server
Каждый новый накопительный пакет обновления для SQL Server содержит все исправления и исправления безопасности, которые входили в состав предыдущего накопительного пакета обновления. Ознакомьтесь с последними накопительными пакетами обновления для SQL Server:
- Последний накопительный пакет обновления для SQL Server 2008 R2 с пакетом обновления 2 (SP2)
- Последний накопительный пакет обновления для SQL Server 2008 с пакетом обновления 3 (SP3)
- Последний накопительный пакет обновления для SQL Server 2014
- Последний накопительный пакет обновления для SQL Server 2012 с пакетом обновления 1 (SP1)
Сведения об исправлениях
Поддерживаемое исправление доступно от корпорации Майкрософт. Однако это исправление предназначено только для устранения проблемы, описанной в этой статье. Примените это исправление только к системам, в которых возникает эта конкретная проблема.
Если исправление доступно для скачивания, в верхней части этой статьи базы знаний отобразится раздел "Доступно скачивание исправления". Если этот раздел не отображается, отправьте запрос в службу поддержки пользователей Майкрософт, чтобы получить исправление.
Примечание Если возникнут дополнительные проблемы или потребуется их устранение, может потребоваться создать отдельный запрос на обслуживание. Обычно техническая поддержка оплачивается за решение дополнительных вопросов и проблем, не подпадающих под это исправление. Полный список телефонных номеров службы поддержки и обслуживания клиентов Майкрософт или создание отдельного запроса на обслуживание см. на следующем веб-сайте Майкрософт:
/contactus/?ws=support Примечание. В форме "Доступно скачивание исправления" указаны языки, для которых доступно исправление. Если вы не видите свой язык, это означает, что для него недоступно исправление.
Состояние
Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».
Дополнительные сведения
Когда приложение устанавливает подключение к SQL Server, оно сначала устанавливает контекст базы данных. По умолчанию подключение будет пытаться получить блокировку базы данных в режиме SH. Блокировка SH-DATABASE будет снята при остановке подключения или изменении контекста базы данных в течение времени существования соединения. Если у вас много активных подключений, использующих один и тот же контекст базы данных, у вас может быть много блокировок ресурса типа DATABASE для этой конкретной базы данных.
На компьютере с 16 или более ЦП только объекты таблицы используют схему секционированной блокировки. Тем не менее, блокировки базы данных не секционированы. Следовательно, чем больше количество блокировок базы данных, тем больше времени требуется серверу SQL Server для получения блокировки базы данных. В большинстве приложений не возникает проблем, вызванных такой конструкцией. Но как только количество превышает определенный порог, для получения блокировки требуется дополнительная работа и время. Несмотря на то, что затраты составляют всего микросекунды для каждой дополнительной блокировки, общее время может быстро увеличиться, так как сегменты хэша блокировки защищены с помощью спин-блокировки. Это вызывает дополнительные циклы ЦП и ожидание получения блокировки дополнительными рабочими процессами.
Это исправление вводит блокирование базы данных, если при запуске включается флаг трассировки T1236. Секционирование блокировки базы данных позволяет контролировать глубину списка блокировки в каждом локальном разделе. Это значительно оптимизирует путь доступа, который используется для получения блокировки базы данных.
Для отслеживания LOCK_HASH спин-блокировки можно использовать следующий запрос. УСТАНОВИТЬ NOCOUNT ON
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
В ТО ВРЕМЯ КАК @counter< 100
BEGIN
ВСТАВКА В #spinlock_stats ВЫБЕРИТЕ GETDATE() Как "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
УСТАНОВИТЕ @counter +=1
END
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
УДАЛИТЬ ТАБЛИЦУ #spinlock_stats Дополнительные сведения о диагностике и разрешении конфликтов спин-блокировки на SQL Server см. в следующем документе:
Диагностика и разрешение конкуренции спин-блокировки в SQL Server Примечание Несмотря на то, что этот документ написан для SQL Server 2008 R2, сведения по-прежнему применимы к SQL Server 2012.
Ссылки
Дополнительные сведения о флагах трассировки в SQL Server 2012 см. на следующем веб-сайте TechNet:
Сведения о флагах трассировки в SQL Server 2012
Для получения дополнительных сведений о том, как найти количество блокировок базы данных в пользователе на базу данных, используйте следующий запрос для вычисления этого значения: select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' из sys.dm_tran_locks
Группировка по Resource_database_id, resource_type, request_mode request_status