KB2926217 - REMEDIERE: Problemele de performanță apar atunci când activitatea de blocare a bazei de date crește în SQL Server

Se aplică la
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

În mod implicit, pachetele Service Pack 1 pentru SQL Server 2014 și Service Pack 3 pentru SQL Server 2012 includ această remediere și nu este necesar să adăugați semnalizări de urmărire pentru a activa remedierea. Pentru a activa remedierea după ce instalați una dintre actualizările cumulative din secțiunea Rezolvare, trebuie să porniți Microsoft SQL Server adăugând semnalizarea de urmărire 1236 la parametrii de pornire.

Simptome

Să presupunem că rulați o instanță Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 sau SQL Server 2008 R2 pe un computer care conține multe procesoare. Atunci când numărul de blocări (tip de resursă = BAZĂ de date) pentru o anumită bază de date depășește un anumit prag, întâmpinați următoarele probleme de performanță:

  • Apar valori ridicate pentru numărul LOCK_HASH spinlock.

    Notă: Consultați secțiunea "Mai multe informații" pentru informații despre monitorizarea acestui spinlock.

  • Interogările sau operațiunile care necesită blocări ale bazei de date necesită mult timp pentru a fi finalizate. De exemplu, este posibil să observați următoarele întârzieri ale performanțelor:

    • Conectări la SQL Server
    • Interogări de server legat
    • sp_reset_connection
    • Tranzacții

Notă Pentru a găsi lista de blocări (tip de resursă = DATABASE) dintr-o bază de date dată, consultați secțiunea "Mai multe informații". Valoarea pragului variază în funcție de mediu.

Rezolvare

Informații despre actualizarea cumulativă

Problema a fost remediată pentru prima dată în următoarea actualizare cumulativă a SQL Server.

Actualizarea cumulativă 13 pentru SQL Server 2008 R2 SP2 /en-us/help/2967540

Actualizarea cumulativă 17 pentru SQL Server 2008 SP3 /en-us/help/2958696

Actualizarea cumulativă 1 pentru SQL Server 2014 /en-us/help/2931693

Actualizarea cumulativă 9 pentru SQL Server 2012 SP1 /en-us/help/2931078

Despre actualizările cumulative pentru SQL Server

Fiecare actualizare cumulativă nouă pentru SQL Server conține toate remedierile rapide și toate remedierile de securitate care au fost incluse cu actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:

      

Informații despre remedierea rapidă
 O remediere rapidă acceptată este disponibilă de la Microsoft. Cu toate acestea, această remediere rapidă este menită să corecteze doar problema descrisă în acest articol. Aplicați această remediere rapidă doar sistemelor care întâmpină această problemă.

Dacă remedierea rapidă este disponibilă pentru descărcare, există o secțiune "Descărcare remediere rapidă disponibilă" în partea de sus a acestui articol din Baza de cunoștințe. Dacă această secțiune nu apare, remiteți o solicitare la Asistență pentru clienți Microsoft pentru a obține remedierea rapidă.

Notă: dacă apar probleme suplimentare sau dacă este necesară vreo depanare, poate fi necesar să creați o solicitare de serviciu separată. Costurile uzuale de suport se vor aplica pentru întrebări suplimentare de suport și pentru probleme ce nu fac obiectul acestei remedieri rapide specifice. Pentru o listă completă a numerelor de telefon pentru asistență și asistență clienți Microsoft sau pentru a crea o solicitare separată de servicii, vizitați următorul site web Microsoft:

/contactus/?ws=support Notă Formularul "Descărcare remediere rapidă disponibilă" afișează limbile pentru care este disponibilă remedierea rapidă. Dacă nu vedeți limba, motivul este faptul că nu este disponibilă o remediere rapidă pentru acea limbă.

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.

Mai multe informații

Atunci când o aplicație se conectează la SQL Server, aceasta stabilește mai întâi un context de bază de date. În mod implicit, conexiunea va încerca să obțină o blocare DATABASE în modul SH. Blocarea SH-DATABASE va fi eliberată atunci când conexiunea este oprită sau când contextul bazei de date este modificat pe durata de viață a conexiunii. Dacă aveți multe conexiuni active care utilizează același context de bază de date, puteți avea multe blocări ale tipului de resursă DATABASE pentru acea bază de date.

Pe computerul care are 16 sau mai multe procesoare, doar obiectele tabel utilizează o schemă de blocare partiționată. Cu toate acestea, blocările bazei de date nu sunt partiționate. Prin urmare, cu cât este mai mare numărul de blocări ale bazei de date, cu atât durează mai mult pentru ca SQL Server să obțină o blocare a bazei de date. Majoritatea aplicațiilor nu întâmpină probleme cauzate de această proiectare. Dar, de îndată ce numărul depășește un anumit prag, sunt necesare muncă și timp suplimentar pentru a obține blocarea. Deși costul este de doar microsecunde pentru fiecare blocare suplimentară, timpul total poate crește rapid, deoarece gălețile hash de blocare sunt protejate folosind un spinlock. Acest lucru provoacă cicluri CPU suplimentare și așteaptă ca alți lucrători să obțină blocarea.

Această remediere rapidă introduce partiționarea blocării DATABASE atunci când semnalizarea de urmărire T1236 este activată la pornire. Partiționarea blocării DATABASE păstrează adâncimea listei de blocare gestionabilă în fiecare partiție locală. Acest lucru optimizează în mod semnificativ calea de acces utilizată pentru a obține o blocare DATABASE.

Pentru a monitoriza LOCK_HASH spinlock, puteți utiliza următoarea interogare. SETAȚI NOCOUNT ACTIVAT
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[rotește] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
ÎN TIMP CE @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 Pentru mai multe informații despre diagnosticarea și rezolvarea contorului de blocare prin rotație pe SQL Server, accesați documentul următor:

Diagnosticarea și rezolvarea disputelor de tip Spinlock pe SQL Server Notă Deși acest document este scris pentru SQL Server 2008 R2, informațiile se aplică în continuare la SQL Server 2012.

Referințe

Pentru mai multe informații despre semnalizatoarele de urmărire din SQL Server 2012, accesați următorul site web TechNet:

Informații despre semnalizările de urmărire în SQL Server 2012
Pentru mai multe informații despre cum să găsiți numărul de blocări ale bazei de date dintr-un utilizator pentru fiecare bază de date, utilizați următoarea interogare pentru a calcula această valoare:selectați Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' din sys.dm_tran_locks
Grupare după Resource_database_id, resource_type, request_mode request_status