Mi è stata posta questa domanda durante un'intervista e non ho avuto risposta. Qualcuno qui può spiegare?
Mi è stata posta questa domanda durante un'intervista e non ho avuto risposta. Qualcuno qui può spiegare?
Risposte:
I blocchi DB possono esistere su righe, pagine o intere tabelle o indici. Quando è in corso una transazione, i blocchi mantenuti dalla transazione occupano risorse. L'escalation dei blocchi è il punto in cui il sistema consolida più blocchi in uno di livello superiore (ad esempio consolidando blocchi di più righe in una pagina o più pagine in un'intera tabella) in genere per recuperare risorse occupate da un numero elevato di blocchi a grana fine.
Lo farà automaticamente, anche se è possibile impostare flag sui tavoli (vedere ALTER TABLE nei libri online) per controllare la politica per l'escalation dei blocchi su quella particolare tabella. In particolare, l'escalation di blocchi prematuri o eccessivamente desiderosi era un problema nelle versioni precedenti di Sybase e SQL Server quando c'erano due processi che scrivevano contemporaneamente righe separate nella stessa pagina. Se torni abbastanza lontano (IIRC SQL Server 6.5) SQL Server non disponeva effettivamente del blocco delle righe ma poteva solo bloccare tabelle o pagine. In questo caso, è possibile che si verifichino conflitti tra inserimenti di record nella stessa pagina; spesso si inserisce un indice cluster sulla tabella in modo che i nuovi inserti siano andati a pagine diverse.
È un metodo per ridurre il sovraccarico del sistema, convertendo molti blocchi a grana fine in meno blocchi a grana grossa. Informazioni più dettagliate sono disponibili qui e qui .
Ad esempio, se si hanno molti blocchi (di solito centinaia o più) su righe specifiche in una tabella, una volta superato il numero massimo consentito di blocchi, questi potrebbero essere scambiati con un blocco sull'intera tabella.
SQL Server fa escalation dei blocchi al fine di ridurre l'overhead di memoria , convertendo diverse serrature basso livello a grana fine a blocchi di alto livello grana grossa.
È un mito che i blocchi di riga vengano convertiti in blocchi di pagine , lo stesso menzionato sopra da @ConcernedOfTunbridgeWells è sbagliato.
Se una tabella con pochissimi aggiornamenti di riga, il motore SQL proverà a prendere i blocchi di riga su quelle righe o il blocco di pagine su quelle pagine. Diciamo che ha richiesto Row-Lock. Ma se gli aggiornamenti di riga aumentano la soglia (~ 5k blocchi), invece di prendere diversi Row-Lock ci vuole un singolo Table-Lock. Pertanto, ciò riduce il sovraccarico di memoria rilasciando diversi blocchi di riga e prendendo un singolo blocco di tabelle, ma aumenta la concorrenza. Lo stesso succede con il blocco della pagina.
La soglia di blocco escalation è di almeno 5000 blocchi e dipende da diversi fattori, una spiegazione dettagliata di blocco escalation è stata menzionata qui in MSL BoL: https://technet.microsoft.com/en-us/library/ms184286(v = SQL.105) aspx