Doamna sql încetinește baza de date atunci când actualizează - overflow stack în rusă

Dacă aveți un SQL Server normal (nu Azure), atunci implicit aveți nivelul de izolare READ COMMITTED. Cum funcționează această actualizare?

  1. UI - blocarea actualizării intenției este setată în tabel. Aceasta înseamnă că procesul dvs. va găsi rândurile din acest tabel care trebuie actualizate.
  2. Începeți să mutați liniile în căutarea celor care trebuie actualizate. Înainte de a verifica dacă este utilă actualizarea liniei, aceasta este setată la blocarea U.
  3. De îndată ce se găsește prima linie pentru actualizare, pe masa este instalată închiderea IX. Procesul dvs. de fapt va actualiza datele.
  4. Pe o anumită linie, X lock este instalat.
  5. instalarea blocărilor U și X continuă pentru toate rândurile, ceea ce duce la instalarea blocărilor X pe fiecare rând actualizat.

Astfel, din momentul în care găsește cel puțin o intrare pentru actualizare și înainte de tranzacția este finalizată (până la sfârșitul update) pe toate rândurile actualizate atârnă X-Loka.













În același timp, se execută SELECT:

  1. Tabelul stabilește blocarea IS - intenția partajată
  2. Blocarea S este instalată pe toate șirurile selectabile.

Problema este că blochează pravialam S compatibilitatea de blocare nu poate fi pus pe linie, care se află deja de blocare X. De fapt, aceasta este esența CITIRE nivel de izolare SĂVÂRȘITE - blocare X înseamnă că datele sunt modificate de un alt proces, dar modificările nu au fost încă vkommitany - și acest lucru, deoarece acestea nu pot fi citite.

Astfel, dacă aveți o mulțime de date actualizate (întregul tabel, nici în cazul în care) sau actualizate procesul de căutare a datelor durează o perioadă lungă de timp (în cazul în care clauza este acolo, dar de indicele / statistici / dificil - este de a vedea un plan!) - care, la momentul actualizării, toate agățat încetinește și cade la expirare.

Puteți obține această restricție enervantă prin includerea izolației instantaneului și înlocuirea READ COMMITTED cu READ_COMMITTED_SNAPSHOT.

În READ_COMMITTED_SNAPSHOT, SELECT va selecta date din propria copie și nu va pune blocările S pe șiruri de caractere. În consecință, nu se va împiedica să instaleze încuietori S pe încuietoarele X ale altor persoane și nu le va aștepta.

Pe SQL Azure, READ_COMMITTED_SNAPSHOT este activat în mod implicit și nu poate fi dezactivat.







Articole similare

Trimiteți-le prietenilor: