Service Pack 1 til SQL Server 2014 og Service Pack 3 til SQL Server 2012 indeholder som standard denne programrettelse, og du behøver ikke at tilføje nogen sporingsflag for at aktivere rettelsen. Hvis du vil aktivere rettelsen, når du har installeret en af de kumulative opdateringer i sektionen Løsning, skal du starte Microsoft SQL Server ved at føje sporingsflag 1236 til startparametrene.
Symptomer
Antag, at du kører en forekomst af Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 eller SQL Server 2008 R2 på en computer, der indeholder mange processorer. Når antallet af låse (ressourcetype = DATABASE) for en bestemt database overstiger en bestemt grænse, oplever du følgende ydelsesproblemer:
Der forekommer forhøjede værdier for LOCK_HASH antal spinlocks.
Bemærk! Se afsnittet "Flere oplysninger" for at få oplysninger om, hvordan du overvåger denne spinlock.
Det tager lang tid for forespørgsler eller handlinger, der kræver databaselåse. Du bemærker f.eks. muligvis følgende forsinkelser i ydeevnen:
- SQL Server-logon
- Forespørgsler om sammenkædede servere
- sp_reset_connection
- Transaktioner
Bemærk! Hvis du vil finde listen over låse (ressourcetype = DATABASE) for en given database, skal du se afsnittet "Flere oplysninger". Tærskelværdien varierer efter miljø.
Løsning
Oplysninger om kumulativ opdatering
Problemet blev først løst i følgende kumulative opdatering af SQL Server.
Samlet opdatering 13 til SQL Server 2008 R2 SP2 /en-us/help/2967540
Samlet opdatering 17 til SQL Server 2008 SP3 /en-us/help/2958696
Samlet opdatering 1 til SQL Server 2014 /en-us/help/2931693
Samlet opdatering 9 til SQL Server 2012 SP1 /en-us/help/2931078
Om kumulative opdateringer til SQL Server
Hver ny kumulativ opdatering til SQL Server indeholder alle de hotfixes og alle de sikkerhedsrettelser, der fulgte med den forrige kumulative opdatering. Se de seneste kumulative opdateringer til SQL Server:
- Seneste kumulative opdatering til SQL Server 2008 R2 SP2
- Seneste kumulative opdatering til SQL Server 2008 SP3
- Seneste kumulative opdatering til SQL Server 2014
- Seneste kumulative opdatering til SQL Server 2012 SP1
Oplysninger om hotfix
Der findes et understøttet hotfix fra Microsoft. Denne hotfix er dog kun beregnet til at løse det problem, der er beskrevet i denne artikel. Anvend kun dette hotfix på systemer, der har dette specifikke problem.
Hvis hotfixet kan downloades, er der afsnittet "Hotfix download available" øverst i denne Knowledge Base-artikel. Hvis dette afsnit ikke vises, skal du sende en anmodning til Microsofts kundeservice og support for at få hotfixet.
Bemærk! Hvis der opstår flere problemer, eller hvis der kræves fejlfinding, kan det være nødvendigt at oprette en separat serviceanmodning. De sædvanlige supportomkostninger gælder for yderligere supportspørgsmål og problemer, der ikke falder ind under dette specifikke hotfix. Du kan se en komplet liste over telefonnumre til Microsofts kundeservice og support eller oprette en separat serviceanmodning på følgende Microsoft-websted:
/contactus/?ws=support Bemærk at formularen "Hotfix download tilgængelig" viser de sprog, hotfixet er tilgængeligt for. Hvis du ikke kan se dit sprog, skyldes det, at der ikke findes et hotfix for det pågældende sprog.
Status
Microsoft har bekræftet, at dette er et problem i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".
Flere oplysninger
Når et program opretter forbindelse til SQL Server, oprettes der først en databasekontekst. Som standard forsøger forbindelsen at opnå en DATABASE-lås i SH-tilstand. SH-DATABASE-låsen frigives, når forbindelsen afbrydes, eller databasekonteksten ændres i løbet af forbindelsens levetid. Hvis du har mange aktive forbindelser, der bruger den samme databasekontekst, kan du have mange låse af ressourcetypen DATABASE for den specifikke database.
På en computer, der har 16 eller flere CPU'er, er det kun tabelobjekter, der bruger et partitioneret låseskema. Databaselåsene er dog ikke partitionerede. Jo større antallet af databaselåse er, desto længere tid tager det for SQL Server at få en lås på databasen. De fleste programmer oplever ingen problemer, der er forårsaget af dette design. Men så snart antallet overstiger en vis tærskel, kræves der yderligere arbejde og tid for at få låsen. Selvom omkostningerne kun er mikrosekunder for hver ekstra lås, kan den samlede tid hurtigt øges, fordi låsens hash-buckets er beskyttet ved hjælp af en spinlock. Dette medfører yderligere CPU-cyklusser og venter på, at flere medarbejdere henter låsen.
Dette hotfix introducerer partitionering med DATABASELÅS, når sporingsflaget T1236 er aktiveret ved start. Partitionering af DATABASE-låsen sikrer, at dybden af låselisten er håndterbar i hver lokal partition. Dette optimerer adgangsstien, der bruges til at opnå en DATABASE-lås, betydeligt.
Hvis du vil overvåge LOCK_HASH spinlock, kan du bruge følgende forespørgsel. INDSTIL INGEN TÆL TIL
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[navn] nvarchar(512),[kollisioner] bigint,
[Spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
MENS @counter< 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
VENTETID PÅ FORSINKELSE '00:00:05'
SET @counter +=1
End
VÆLG * FRA #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Du kan finde flere oplysninger om diagnosticering og løsning af spinlock-konflikter på SQL Server i følgende dokument:
Diagnosticering og løsning af Spinlock-konflikter på SQL Server Bemærk! Selvom dette dokument er skrevet til SQL Server 2008 R2, er oplysningerne stadig gældende for SQL Server 2012.
Referencer
Du kan finde flere oplysninger om sporingsflag i SQL Server 2012 på følgende TechNet-websted:
Oplysninger om sporingsflag i SQL Server 2012
Du kan finde flere oplysninger om, hvordan du finder antallet af databaselåse i bruger pr. database, ved at bruge følgende forespørgsel til at beregne denne værdi:select Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' fra sys.dm_tran_locks
Gruppér efter Resource_database_id, resource_type, request_mode request_status