SQL Server 2018 R2 debloca probleme cu încuietori

Blocarea apare atunci când o sesiune de baze de date, sau ID-ul de proces de server (SPID), dobândește de blocare o anumită resursă, iar în acest moment al doilea SDID este încercarea de a obține un conflict de blocare a aceleiași resurse. De obicei, un bloc de resurse nu dolgo.Kak ultimul numai prima sesiune, se anulează blocarea, acesta poate primi al doilea SDID, pentru a continua procesarea solicitării.

Faptele dure de viață încuietori

Blocarea implicită amalgamate cu nivelul de rânduri individuale pentru a completa pagina a mesei, chiar înainte de nivelul de motive de performanță. Deși, în general, de consolidare este considerat un lucru bun, poate cauza probleme, cum ar fi atunci când același SSID blochează întregul tabel, împiedicând alte SSID-ul să-l opereze.

Durata încuietori determinate de tipurile de interogări. Atunci când o cerere de tranzacție nu este îndeplinită și nu utilizează indicii de blocare de blocare pentru a efectua instrucțiuni SELECT sunt efectuate numai în momentul citirii resursei, dar nu la momentul solicitării. Broaste pentru instrucțiuni INSERT, UPDATE și DELETE sunt stocate pe durata solicitării. Acest lucru asigură consecvența datelor și permite rola SQL Server înapoi cereri, dacă este necesar.

În cazul în care solicitarea este efectuată în cadrul unei tranzacții, durata de blocare este determinată de trei factori:

  • un tip de solicitare;
  • nivel de izolare tranzacție;
  • prezența sau absența indicii de blocare.

Parțial (blocare) și convenționale (blocare) de blocare - normală în baze de date relaționale, dar ele pot degrada performanța în cazul în care blocarea resurselor stocate pentru o lungă perioadă de timp. Productivitatea, de asemenea, suferă atunci când blocarea resursa, SDID nu este capabil să-l elibereze.

În primul caz, problema se rezolva, de obicei, după un anumit timp, deoarece SDID va elibera în cele din urmă de blocare, dar amenințarea degradarea performanței rămâne foarte real. Probleme cu blocarea celui de al doilea tip poate provoca o scădere gravă a performanței, dar, din fericire, acestea sunt ușor de detectat prin monitorizarea SQL Server pe subiectul pe termen scurt și încuietori convenționale.

Îmblânzirea încuietorile

Activity Monitor (Activity Monitor) SQL Server ajută la detectarea problemelor cu termen scurt și încuietori convenționale. Acordați o atenție deosebită indicatorilor de timp de așteptare (Timeout), așteptați Tip (Tip Standby), așteptați de resurse (resurse Standby) și blocate de (blocat) pentru specificat în lista de procese.

Cele mai multe informații despre procesele, următoarele sunt preluate din opiniile dinamice în Activity Monitor:

  • sys.dm_os_tasks
  • sys.dm_os_waiting_tasks
  • sys.dm_exec_requests
  • sys.dm_exec_sessions
  • sys.dm_resource_governor_workload_group

Ia-o imagine mai clară a pe termen scurt și încuietori convenționale pot utiliza sys.dm_tran_locks de prezentare, care oferă informații despre cererile de blocare activ - completat și execuție așteaptă. sys.dm_exec_connections Prezentare, sys.dm_exec_sessions sys.dm_exec_requests și să furnizeze informații în mod corespunzător cu privire la conexiunile active, sesiuni și interogări.

Observați sys.dm_exec_requests (este descrisă în detaliu în MSDN Library). Interogările la starea «somn» (Suspendat) au finalizat execuție și este probabil în așteptarea unei comenzi din aplicație. Interogările la starea «Running» (în curs) sau «Runnable» (gata pentru a rula) este în prezent în curs de procesare. Cerere cu starea de «suspendat» (suspendat) așteaptă blocarea sau alt eveniment.

wait_type coloană după cum sugerează și numele, se întoarce să aștepte tip. Dacă valoarea este mai mare decât zero, SDID așteaptă. Pentru mai multe informații, se referă la coloane și wait_time wait_resource. În cazul în care cererea este blocat, în wait_time arătat durata în milisecunde. În wait_resource Set de resurse, care este de așteptat de eliberarea SDID. Rețineți, de asemenea că blocking_session_id conțin ID-uri de sesiune, blocarea o cerere sau o valoare negativă cu informații despre proprietarul unei resurse blocate.

Necorespunzător rularea aplicațiilor din prim-plan poate crea o varietate de probleme cu blocarea. În cazul în care cererea este în imposibilitatea de a controla în mod adecvat nivelurile de tranzacții imbricate, este posibil să aveți o situație cu un sistem de blocare în care tipul de solicitare de așteptare (wait_type) este zero, starea de «somn», dar numărul de tranzacții (open_transaction_count) nu este zero.

Cel mai probabil, în anexă oferă o cerere de expirare sau de a iniția comanda de anulare, fără a crea numărul necesar de ROLLBACK și COMMIT. Din acest motiv, blocarea va rămâne activ, iar celălalt SDID nu le pot obține. SQL Server corectează automat astfel de situații. Manipularea corectă a tranzacțiilor imbricate revine cu cererea.

În cazul în care cererea nu selectează toate rândurile din rezultatul obținut cu blocarea situației în care tipul de solicitare de așteptare (wait_type) este zero, starea de «executabilă», dar numărul de tranzacții (open_transaction_count) nu este zero. Este cel mai probabil ca cererea nu va selecta toate liniile de rezultate și a lăsat de blocare pe masă, închizând accesul la acesta este un alt SPID. Dacă este posibil, cererea trebuie să fie configurat astfel încât să selectează toate rezultatele.

În cazul unor probleme pe partea de server, cu probleme de blocare pot fi rezolvate prin crearea de indexuri adecvate în bazele lor de date SQL Server. De asemenea, este posibil să se adapteze cererii, dacă este necesar. Indecși poate reduce numărul de înregistrări folosite în procesarea solicitării. Acest lucru se face prin reducerea numărului de căutări pe care trebuie să le respecte motorul de baze de date. Pentru a determina tabelele și coloanele pe care doriți să indexeze, utilizați următoarele vizualizări dinamice:

  • sys.dm_db_missing_index_groups
  • sys.dm_db_missing_index_details
  • sys.dm_db_missing_index_group_stats

Este important să ne amintim că indicele poate încetini operațiunile de modificare a datelor (așa cum este descris în articolul „Cu privire la operațiunile de index“). Prin urmare, atunci când creați indecși să fie sigur de a utiliza index_usage_stats reprezentarea sys.dm_db_.

Indexarea nu produce în mod necesar tabele permanente de blocare. Atunci când indexare este singurul agent de blocare intenție colectivă (intenție Ponderea, IS), în tabela sursă principală de la operație etapă de indexare runtime. Acest lucru vă permite să continuați interogări de funcționare sau actualizări. În general, blocarea colectivă aplicată pe țintă pentru o perioadă scurtă de timp, la început (și, în unele cazuri, la sfârșitul) operațiunea de indexare.

Când blocarea este cauzată de o solicitare normală, dar cu o lungă durată, aceasta este în valoare de gândire despre optimizarea interogare. Cel mai bine este de a face acest lucru prin reducerea numărului de resurse care sunt blocate în tranzacție. Pentru această tranzacție ar trebui să se facă cât mai puțin posibil prin eliminarea operațiunilor necritice, rămânând doar cu adevărat necesar. Acesta ar trebui să ia în considerare, de asemenea, divizarea unei tranzacții în mai multe interogări care afectează mai puține rânduri, dar numai în cazul în care nu afectează rezultatul final. Operațiunile trebuie să fie proiectate astfel încât să utilizeze niveluri corecte de izolare tranzacție, nu uitați să utilizați, de asemenea, indicii de blocare pentru a reduce blocare de timp, fără a afecta valabilitatea rezultatelor finale.

impasuri de luptă

Un tip special de problemă de blocare a numit-blocare (blocaj), și are loc atunci când două sau mai multe blocarea SPID obține obiecte diferite, dar fiecare dintre SDID au nevoie de un obiect care este blocat de un alt SPID. În această situație, fiecare SPID așteaptă celălalt pentru a elibera blocajele, dar nu se întâmplă. Puteți reduce numărul de blocaje, dar acestea nu pot fi complet evitate. Din fericire, de blocare dispecer în SQL Server detectează automat apariția blocajelor. Găsirea o astfel de problemă, managerul de blocare efectuează trei operații:

  • selectează SPID, care urmează să fie distruse;
  • inițiază un mesaj de eroare 1205 este trimis la client corespunzător;
  • Ea distruge SPID, că a eliberat resursa blocat și să continue activitatea unui alt SPID.

Monitorizarea activității și de prezentare sys.dm_tran_locks ajuta, de asemenea, pentru a detecta impasuri. Monitorul de activitate este necesară monitorizarea timpului de performanță Așteptați (timpul scurs în milisecunde), așteptați tipul (arată dacă operațiunea de eliberare este de așteptare) și așteptați Resource (în cazul în care starea de așteptare indică o resursă, este de așteptat, a cărui lansare).

aplicarea planului frontal trebuie să fie proiectate astfel încât să fie capabil să facă față cu impasuri. Scrise corect prim-plan cerere, obtinerea de eroare 1205 trebuie să re-conectați la SQL Server și re-iniția o tranzacție. O astfel de cerere trebuie să monitorizeze, de asemenea, blocajul distribuit când este posibil simultan acelasi solicitări a resurselor la nivel de client și server.

În această situație, aplicația poate rezolva impasuri folosind timeout interogare sau conexiuni legate distribuite. În primul caz distribuit interblocare eliminat după timeout și al doilea client creează mai multe conexiuni care aparțin aceleiași tranzacții, astfel încât acestea să nu se blocheze reciproc.

Am atins doar suprafața problemei, care descrie modul în care funcționează de blocare și modul de rezolvare a problemelor apar în timpul utilizării. În cele mai multe cazuri, SQL Server se ocupă de mai multe încuietori provocări, inclusiv impasuri. Eliminarea sau cel puțin a minimiza problemele cu încuietorile pot fi în detrimentul unei proiectări corespunzătoare de aplicare. Începeți cu o interogări de design atent și aplicații front-end, în cele din urmă se deplasează pentru a îmbunătăți partea de server.

Conținut legat