Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cosa sono i blocchi di righe, pagine e tabelle? E quando vengono acquisiti?

Blocco righe

Un blocco di riga è il livello più basso di granularità di blocco possibile in SQL Server. Ciò significa che una o più righe specifiche verranno bloccate e le righe adiacenti sono ancora disponibili per il blocco da query simultanee.

Blocco pagina

Un blocco di pagina in SQL Server bloccherà 8 KB di dati anche quando la query richiede solo 10 byte dalla pagina. Quindi la tua query bloccherà dati aggiuntivi che non richiedi nella tua query.

Blocco Hobt

Quando una tabella viene partizionata con "Partizionamento tabella SQL Server" è possibile che una singola partizione venga bloccata (Hobt sta per Heap o B-Tree)

Nota: L'escalation dei blocchi ai blocchi HOBT è disabilitata per impostazione predefinita. esegui ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO) per abilitare l'escalation del blocco HOBT.

Blocco da tavolo

Un blocco della tabella bloccherà la tabella completa.

Cosa sono le pagine di dati

Microsoft SQL Server organizza tutti i suoi dati in "Pagine dati" che possono contenere 8K di dati. Ciò significa che per qualsiasi accesso ai dati in SQL Server 8K verranno lette le informazioni.

Le pagine di dati possono contenere solo informazioni da una tabella e il layout di una pagina è ben documentato su MSDN

Il fatto che SQL Server leggerà sempre una pagina di dati completa ti dà anche un'idea del motivo per cui preferisce utilizzare i blocchi a livello di pagina. L'implicazione dei blocchi a livello di pagina è che potresti bloccare molti più dati di quanto pensi.

Ad esempio, supponiamo di avere una tabella con una dimensione record totale di 1024 byte con un indice cluster nel campo ID . Quando eseguiamo la seguente query:SELECT * from MyTable (xlock) where ID = 123 non solo quel record verrà bloccato, ma (a seconda del riempimento della pagina) verranno bloccati anche un massimo di 3 record aggiuntivi.

Quando vengono acquisiti questi blocchi

Una query verrà analizzata dal governatore della query e i blocchi richiesti verranno determinati e richiesti dal gestore dei blocchi. SQL Server tenterà di creare un equilibrio tra prestazioni e contesa per determinare la strategia di blocco.

SQL Server segue anche un sistema di "escalation dei blocchi" che ridurrà la granularità del blocco quando vengono acquisiti più di 5000 blocchi di un determinato tipo. Per ulteriori informazioni, consulta questo articolo sull'escalation dei blocchi.

Questo comportamento può essere modificato utilizzando suggerimenti di blocco con l'accento su suggerimenti , in una query puoi specificare per tabella quale tipo di lock preferisci. SQL Server tenterà di soddisfare la tua richiesta, ma applicherà comunque l'escalation dei blocchi.