KB2926217 - FIX: Prestatieproblemen treden op wanneer de databasevergrendelingsactiviteit toeneemt in SQL Server

Van toepassing op
SQL Server 2012 Enterprise SQL Server 2012 Developer SQL Server 2012 Standard SQL Server 2012 Express SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2008 Service Pack 3 SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 R2 Service Pack 2 SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard

Standaard bevatten Service Pack 1 voor SQL Server 2014 en Service Pack 3 voor SQL Server 2012 deze correctie en u hoeft geen traceringsvlaggen toe te voegen om de oplossing in te schakelen. Als u de oplossing wilt inschakelen nadat u een van de cumulatieve updates in de sectie Oplossing hebt geïnstalleerd, moet u Microsoft SQL Server starten door traceringsvlag 1236 toe te voegen aan de opstartparameters.

Symptomen

Stel dat u een exemplaar van Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 of SQL Server 2008 R2 uitvoert op een computer met veel processors. Wanneer het aantal vergrendelingen (resource type = DATABASE) voor een bepaalde database een bepaalde drempelwaarde overschrijdt, treden de volgende prestatieproblemen op:

  • Er treden verhoogde waarden op voor LOCK_HASH aantal spinlocks.

    Opmerking: Zie de sectie "Meer informatie" voor informatie over het bewaken van deze spinlock.

  • Query's of bewerkingen waarvoor databasevergrendelingen zijn vereist, duren lang. Je kunt bijvoorbeeld de volgende prestatievertragingen merken:

    • SQL Server-aanmeldingen
    • Query's voor gekoppelde servers
    • sp_reset_connection
    • Transacties

Opmerking Als u de lijst met vergrendelingen (resource type = DATABASE) in een bepaalde database wilt vinden, raadpleegt u de sectie "Meer informatie". De drempelwaarde verschilt per omgeving.

Oplossing

Informatie over cumulatieve updates

Het probleem werd voor het eerst opgelost in de volgende cumulatieve update van SQL Server.

Cumulatieve update 13 voor SQL Server 2008 R2 SP2 /nl-nl/help/2967540

Cumulatieve update 17 voor SQL Server 2008 SP3 /nl-nl/help/2958696

Cumulatieve update 1 voor SQL Server 2014 /nl-nl/help/2931693

Cumulatieve update 9 voor SQL Server 2012 SP1 /nl-nl/help/2931078

Informatie over cumulatieve updates voor SQL Server

Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingspatches die deel uitmaakten van de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:

      

Hotfix-informatie
 Er is een ondersteunde hotfix beschikbaar van Microsoft. Deze hotfix is echter alleen bedoeld om het probleem op te lossen dat in dit artikel wordt beschreven. Pas deze hotfix alleen toe op systemen waarop dit specifieke probleem zich voordoet.

Als de hotfix kan worden gedownload, vindt u bovenaan dit Knowledge Base-artikel de sectie Hotfix-download beschikbaar. Als deze sectie niet wordt weergegeven, dien dan een aanvraag in bij de klantenservice en ondersteuning van Microsoft om de hotfix te verkrijgen.

Opmerking Als er nog meer problemen optreden of als er oplossingen nodig zijn, moet u mogelijk een afzonderlijke serviceaanvraag maken. De gebruikelijke ondersteuningskosten zijn van toepassing op aanvullende ondersteuningsvragen en problemen die niet in aanmerking komen voor deze specifieke hotfix. Voor een volledige lijst met telefoonnummers van de klantenservice en ondersteuning van Microsoft of om een afzonderlijke serviceaanvraag te maken, gaat u naar de volgende Microsoft-website:

/contactus/?ws=support Opmerking: Het formulier 'Hotfixdownload beschikbaar' geeft de talen weer waarvoor de hotfix beschikbaar is. Als je je taal niet ziet, komt dit doordat er geen hotfix beschikbaar is voor die taal.

Status

Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in het gedeelte 'Van toepassing op'.

Meer informatie

Wanneer een toepassing verbinding maakt met SQL Server, wordt eerst een databasecontext tot stand gebracht. Standaard probeert de verbinding een DATABASE lock te verkrijgen in SH-modus. De SH-DATABASE-vergrendeling wordt opgeheven wanneer de verbinding wordt gestopt of de databasecontext wordt gewijzigd tijdens de levensduur van de verbinding. Als u veel actieve verbindingen hebt die gebruikmaken van dezelfde databasecontext, kunt u veel vergrendelingen van het resourcetype DATABASE hebben voor die specifieke database.

Op een computer met 16 of meer CPU's gebruiken alleen tabelobjecten een gepartitioneerd vergrendelingsschema. De databasevergrendelingen zijn echter niet gepartitioneerd. Hoe groter het aantal databasevergrendelingen, hoe langer het duurt voordat SQL Server de database vergrendelt. De meeste toepassingen ondervinden geen problemen die worden veroorzaakt door dit ontwerp. Maar zodra het aantal een bepaalde drempel overschrijdt, is er extra werk en tijd nodig om de vergrendeling te verkrijgen. Hoewel de kosten slechts microseconden bedragen voor elke extra lock, kan de totale tijd snel oplopen omdat de lock hash buckets worden beschermd met behulp van een spinlock. Dit veroorzaakt extra CPU-cycli en wachttijden tot extra werknemers de vergrendeling verkrijgen.

Deze hotfix introduceert partitionering met DATABASE-vergrendeling wanneer traceringsvlag T1236 wordt ingeschakeld bij het opstarten. Door de DATABASE-vergrendeling te partitioneren, blijft de diepte van de vergrendelingslijst beheersbaar in elke lokale partitie. Hierdoor wordt het toegangspad dat wordt gebruikt voor het verkrijgen van een DATABASE-vergrendeling aanzienlijk geoptimaliseerd.

Als u de LOCK_HASH spinlock wilt controleren, kunt u de volgende query gebruiken. STEL AANTALGEN IN
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
TERWIJL @counter< 100
      BEGIN
            INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            WACHT OP VERTRAGING '00:00:05'
            INSTELLEN @counter +=1
      End
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Ga naar het volgende document voor meer informatie over het diagnosticeren en oplossen van spinlockconflicten op SQL Server:

Spinlockconflicten in SQL Server diagnosticeren en oplossen Opmerking Hoewel dit document is geschreven voor SQL Server 2008 R2, is de informatie nog steeds van toepassing op SQL Server 2012.

Meer informatie

Ga naar de volgende TechNet-website voor meer informatie over traceringsvlaggen in SQL Server 2012:

Informatie over traceringsvlaggen in SQL Server 2012
Voor meer informatie over hoe u het aantal databasevergrendelingen in een gebruiker per database kunt vinden, gebruikt u de volgende query om deze waarde te berekenen: select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' uit sys.dm_tran_locks
Groeperen op Resource_database_id, resource_type, request_mode, request_status