KB2926217 – LØSNING: Ytelsesproblemer oppstår når aktiviteten for databaselås øker i SQL Server

Gjelder for
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

Service Pack 1 for SQL Server 2014 og Service Pack 3 for SQL Server 2012 inkluderer som standard denne løsningen, og du trenger ikke å legge til sporingsflagg for å aktivere løsningen. Hvis du vil aktivere løsningen etter at du har installert en av de kumulative oppdateringene i Løsning-delen, må du starte Microsoft SQL Server ved å legge til sporingsflagg 1236 i oppstartsparametere.

Symptomer

Anta at du kjører en forekomst av Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 eller SQL Server 2008 R2 på en datamaskin som har mange prosessorer. Når antall låser (ressurstype = DATABASE) for en bestemt database overskrider en bestemt terskel, oppstår følgende ytelsesproblemer:

  • Forhøyede verdier forekommer for LOCK_HASH antall verdier som snurrlåser.

    Se avsnittet «Mer informasjon» for informasjon om hvordan du overvåker denne spinlocken.

  • Spørringer eller operasjoner som krever databaselås, tar lang tid å fullføre. Du kan for eksempel legge merke til følgende ytelsesforsinkelser:

    • SQL Server-pålogginger
    • Koblede serverspørringer
    • sp_reset_connection
    • Transaksjoner

Obs! Hvis du vil finne listen over låser (ressurstype = DATABASE) i en gitt database, kan du se delen «Mer informasjon». Terskelverdien varierer etter miljø.

Oppløsning

Informasjon om kumulativ oppdatering

Problemet ble først løst i den følgende kumulative oppdateringen av SQL Server.

Kumulativ oppdatering 13 for SQL Server 2008 R2 SP2 /en-us/help/2967540

Kumulativ oppdatering 17 for SQL Server 2008 SP3 /en-us/help/2958696

Kumulativ oppdatering 1 for SQL Server 2014 /en-us/help/2931693

Kumulativ oppdatering 9 for SQL Server 2012 SP1 /en-us/help/2931078

Om kumulative oppdateringer for SQL Server

Hver nye kumulative oppdatering for SQL Server inneholder alle hurtigreparasjoner og alle sikkerhetsrettinger som fulgte med den forrige kumulative oppdateringen. Ta en titt på de nyeste kumulative oppdateringene for SQL Server:

      

Informasjon om hurtigreparasjoner
 En støttet hurtigreparasjon er tilgjengelig fra Microsoft. Denne hurtigreparasjonen er imidlertid bare ment å løse problemet som er beskrevet i denne artikkelen. Bruk denne hurtigreparasjonen bare på systemer som har dette bestemte problemet.

Hvis hurtigreparasjonen er tilgjengelig for nedlasting, finner du delen «Hurtigreparasjonsnedlasting tilgjengelig» øverst i denne Knowledge Base-artikkelen. Hvis denne delen ikke vises, sender du en forespørsel til Microsofts kundeservice og kundestøtte for å få hurtigreparasjonen.

Obs! Hvis det oppstår flere problemer eller hvis feilsøking kreves, må du kanskje opprette en separat serviceforespørsel. De vanlige støttekostnadene gjelder for flere kundestøttespørsmål og problemer som ikke kvalifiserer for denne bestemte hurtigreparasjonen. Gå til følgende Microsoft-webområde for å få en fullstendig liste over telefonnumre for kundeservice og kundestøtte eller opprette en separat serviceforespørsel:

/contactus/?ws=support Obs! Skjemaet «Hurtigreparasjonsnedlasting tilgjengelig» viser språkene som hurtigreparasjonen er tilgjengelig for. Hvis du ikke ser språket ditt, er det fordi en hurtigreparasjon ikke er tilgjengelig for dette språket.

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen «Gjelder for».

Mer informasjon

Når et program oppretter en tilkobling til SQL Server, etablerer det først en databasekontekst. Som standard prøver tilkoblingen å oppnå en DATABASELÅS i SH-modus. SH-DATABASE-låsen frigis når tilkoblingen stoppes eller databasekonteksten endres i løpet av levetiden til tilkoblingen. Hvis du har mange aktive tilkoblinger som bruker samme databasekontekst, kan du ha mange låser av ressurstypen DATABASE for den bestemte databasen.

På datamaskiner som har 16 eller flere CPU-er, er det bare tabellobjekter som bruker et partisjonert låseoppsett. Databaselåsene er imidlertid ikke partisjonerte. Jo større antall databaselåser er, desto lengre tid tar det for SQL Server å låse databasen. De fleste programmer opplever ingen problemer som forårsakes av denne utformingen. Men så snart antallet overstiger en viss terskel, kreves det ekstra arbeid og tid for å få låsen. Selv om kostnaden bare er mikrosekunder for hver ekstra lås, kan den totale tiden raskt øke fordi hash-bøttene for låsen er beskyttet ved hjelp av en spinlock. Dette fører til flere CPU-sykluser og venter på at flere arbeidere skal få låsen.

Denne hurtigreparasjonen introduserer partisjonering av DATABASELÅS når sporingsflagg T1236 aktiveres ved oppstart. Partisjonering av DATABASE-låsen gjør dybden på låselisten håndterbar i hver lokale partisjon. Dette optimaliserer tilgangsbanen som brukes til å oppnå en DATABASE-lås, betydelig.

Hvis du vil overvåke LOCK_HASH spinlock, kan du bruke følgende spørring. ANGI INGEN TELLING PÅ
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[navn] nvarchar(512),[kollisjoner] bigint,
[spinn] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
MENS @counter< 100
      BEGIN
            SETT INN I #spinlock_stats VELG GETDATE() som «CaptureTime» , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
            VENTFOR FORSINKELSE '00:00:05'
            SETT @counter +=1
      END
VELG * FRA #spinlock_stats SORTER ETTER [CaptureTime]
DROP TABLE #spinlock_stats Hvis du vil ha mer informasjon om diagnostisering og løsning av spinlock-konflikt på SQL Server, kan du gå til følgende dokument:

Diagnostisere og løse Spinlock-konflikt på SQL Server Obs! Selv om dette dokumentet er skrevet for SQL Server 2008 R2, gjelder informasjonen fortsatt for SQL Server 2012.

Kilder

Hvis du vil ha mer informasjon om sporingsflagg i SQL Server 2012, går du til dette TechNet-webområdet:

Informasjon om sporingsflagg i SQL Server 2012
Hvis du vil ha mer informasjon om hvordan du finner antall databaselåser hos bruker per database, kan du bruke følgende spørring til å beregne denne verdien:velg Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' fra sys.dm_tran_locks
Grupper etter Resource_database_id, resource_type, request_mode request_status