За замовчуванням це виправлення включають пакет оновлень 1 для SQL Server 2014 і 3 для SQL Server 2012 року, тому не потрібно додавати позначки трасування, щоб увімкнути його. Щоб увімкнути виправлення після інсталяції одного з сукупних оновлень у розділі "Роздільна здатність", потрібно запустити Microsoft SQL ServerSQL Server, додавши позначку трасування 1236 до параметрів запуску.
Ознаки
Припустімо, що на комп'ютері з великою кількістю процесорів використовується екземпляр Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 або SQL Server 2008 R2. Коли кількість блокувань (тип ресурсу = DATABASE) для певної бази даних перевищує певне граничне значення, виникають наведені нижче проблеми з продуктивністю.
Для лічильника спінлоків LOCK_HASH виникають підвищені значення.
Примітка: Дивіться розділ «Додаткова інформація», щоб отримати інформацію про те, як контролювати цей спінлок.
Запити або операції, які потребують блокування бази даних, виконуються надто довго. Наприклад, можуть спостерігатися такі затримки продуктивності:
- SQL ServerSQL Server logins
- Запити зв'язаного сервера
- sp_reset_connection
- Транзакції
Примітка. Щоб знайти список блокувань (тип ресурсу = DATABASE) у певній базі даних, див. розділ "Додаткові відомості". Граничне значення залежить від середовища.
Спосіб усунення проблеми
Сукупні відомості про оновлення
Вперше виправлено цю проблему в наступному сукупному оновленні SQL ServerSQL Server.
Сукупний пакет оновлень 13 для SQL Server 2008 R2 з пакетом оновлень 2 (SP2) /en-us/help/2967540
Сукупний пакет оновлень 17 для SQL Server 2008 р. з пакетом оновлень 3 (SP3) /en-us/help/2958696
Сукупний пакет оновлень 1 за SQL Server 2014 р. /uk-ua/help/2931693
Сукупний пакет оновлень 9 для SQL Server 2012 р. (SP1) /en-us/help/2931078
Відомості про сукупні оновлення для SQL ServerSQL Server
Кожне нове сукупне оновлення для SQL Server містить усі виправлення та виправлення системи безпеки, які входили до попереднього сукупного пакета оновлень. Перегляньте останні сукупні оновлення для SQL Server.
- Останнє сукупне оновлення для SQL ServerSQL Server 2008 R2 SP2
- Останнє сукупне оновлення для SQL ServerSQL Server 2008 SP3
- Останнє сукупне оновлення для SQL ServerSQL Server 2014
- Останнє сукупне оновлення для SQL Server 2012 із пакетом оновлень 1 (SP1)
Відомості про виправлення
Підтримуване поточне виправлення можна отримати від корпорації Майкрософт. Однак це виправлення призначено лише для виправлення проблеми, описаної в цій статті. Застосовуйте це виправлення лише до систем, у яких виникла ця конкретна проблема.
Якщо виправлення доступне для завантаження, угорі цієї статті в базі знань відображається розділ "Доступне завантаження виправлень". Якщо цей розділ не відображається, надішліть запит до служби обслуговування й підтримки клієнтів корпорації Майкрософт, щоб отримати виправлення.
Примітка. У разі виникнення додаткових проблем або необхідності виправлення неполадок може знадобитися створити окремий запит на обслуговування. За додаткові послуги підтримки, не пов'язані з цим конкретним виправленням, плата стягується на загальних засадах. Щоб отримати повний перелік номерів телефонів служби підтримки й підтримки клієнтів корпорації Майкрософт або створити окремий запит на обслуговування, відвідайте веб-сайт корпорації Майкрософт:
/contactus/?ws=support Примітка. У формі "Доступне завантаження виправлень" відображаються мови, для яких доступне виправлення. Якщо ви не бачите свою мову, це означає, що виправлення недоступні для неї.
Стан
Корпорація Microsoft підтвердила, що це одна з проблем з продуктами Microsoft, перелічених у розділі "Застосовується до".
Додаткові відомості
Коли програма підключається до SQL Server, вона спочатку встановлює контекст бази даних. За замовчуванням підключення намагатиметься отримати блокування бази даних у режимі SH. Блокування SH-DATABASE розслабляється, якщо підключення припиняється або змінюється контекст бази даних протягом усього терміну дії підключення. Якщо у вас багато активних підключень, які використовують той самий контекст бази даних, ви можете мати багато блокувань типу ресурсу DATABASE для певної бази даних.
На комп'ютері з 16 або більше ЦП схему блокування розділів використовуються лише для об'єктів таблиць. Проте розділи бази даних не розділено. Таким чином, що більша кількість блокувань бази даних, то більше часу знадобиться SQL Server, щоб отримати блокування бази даних. Більшість програм не відчувають жодних проблем, викликаних такою конструкцією. Але як тільки кількість перевищить певний поріг, для отримання замку потрібні додаткові роботи і час. Незважаючи на те, що вартість становить лише мікросекунди для кожного додаткового замка, загальний час може швидко збільшитися, оскільки хеш-ковші замків захищені за допомогою спінлока. Це спричиняє додаткові цикли процесора та очікування на блокування додатковими робочими процесорами.
Це поточне виправлення вводить розділи блокування БАЗИ даних, якщо прапорець трасування T1236 увімкнуто під час запуску. Розбиття на розділи блокування БАЗИ даних зберігає керовану глибину списку блокування в кожному локальному розділі. Це значно оптимізує шлях доступу, який використовується для отримання блокування DATABASE.
Щоб відстежувати LOCK_HASH spinlock, можна скористатися наведеним нижче запитом. SET NOCOUNT ON
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[spins] велике ціле,[spins_per_collision] реальне,[sleep_time] велике ціле,[відступники] int)
DECLARE @counter int = 1
ТОДІ ЯК @counter< 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
SET @counter +=1
End
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Щоб дізнатися більше про діагностику та вирішення суперечок щодо блокування лічильника в SQL Server, перейдіть до цього документа:
Діагностика та вирішення суперечок про спінлок на SQL Server Примітка Незважаючи на те, що цей документ написаний для SQL Server 2008 R2, інформація все ще застосовна до SQL Server 2012 року.
Посилання
Докладні відомості про позначки трасування в SQL Server 2012 року див. на веб-сайті TechNet за посиланням нижче.
Information about trace flags in SQL ServerSQL 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