Condividi tramite


Scrivere pagine nel motore di database

Si applica a: SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

L'I/O di un'istanza del motore di database include scritture logiche e fisiche. La scrittura logica viene eseguita quando vengono modificati i dati di una pagina nella cache del buffer. La scrittura fisica viene eseguita quando la pagina viene scritta dalla cache del buffer nel disco.

Quando una pagina viene modificata nella cache del buffer, non viene immediatamente riscritta su disco; La pagina viene invece contrassegnata come dirty. Ciò significa che una pagina può avere più di una scrittura logica eseguita prima che venga scritta fisicamente su disco. Per ogni scrittura logica, viene inserito un record del log delle transazioni nella cache del log, per registrare la modifica. I record di log devono essere scritti sul disco prima che la pagina dirty associata venga rimossa dalla cache buffer e scritta sul disco.

SQL Server utilizza una tecnica nota come Write-Ahead Logging (WAL) che impedisce la scrittura di una pagina sporca prima che il record di log associato sia scritto su disco. Questa procedura è fondamentale per garantire il corretto funzionamento della gestione del recupero. Per ulteriori informazioni, vedere Log delle transazioni Write-ahead.

Come SQL Server scrive una pagina di dati modificata

Nella figura seguente viene illustrato il processo di scrittura di una pagina di dati modificata.

Screenshot di Writing_Pages.

Quando il gestione buffer scrive una pagina, cerca pagine sporche adiacenti che possano essere incluse in un'unica operazione di scrittura sequenziale. Le pagine adiacenti hanno ID pagina consecutivi e provengono dallo stesso file; le pagine non devono essere contigue in memoria. La ricerca continua in avanti e indietro fino a quando non si verifica uno degli eventi seguenti:

  • Viene individuata una pagina pulita.
  • Vengono individuate 32 pagine.
  • Viene trovata una pagina sporca il cui numero di sequenza di log (LSN) non è ancora stato registrato nel registro dei log.
  • Si è trovata una pagina che non può essere immediatamente collegata.

In questo modo, è possibile scrivere l'intero set di pagine nel disco con un'unica operazione di scrittura sequenziale.

Prima della scrittura, viene aggiunta alla pagina la forma di protezione specificata nel database.

  • Se viene aggiunta la protezione da pagina strappata, la pagina deve essere bloccata esclusivamente (EX) per l'I/O. Questo accade perché la protezione della pagina strappata modifica la pagina, rendendola inadatta alla lettura da parte di altri thread.

  • Se viene aggiunta la protezione della pagina checksum, oppure il database non utilizza alcuna protezione di pagina, la pagina viene bloccata con un latch di aggiornamento (UP) per l'I/O. Questo latch impedisce a chiunque altro di modificare la pagina durante la scrittura, ma consente tuttavia ai lettori di utilizzarla.

Per altre informazioni sulle opzioni di protezione delle pagine di I/O del disco, vedere Gestione del buffer.

Come vengono scritte le pagine sporche su disco

Una pagina dirty può venire scritta nel disco in tre modi:

I processi di scrittura lazy, scrittura eager e checkpoint non attendono il completamento dell'operazione di input/output. Questi processi utilizzano sempre l'I/O asincrono, o sovrapposto, e continuano a eseguire altre operazioni, verificando solo successivamente se l'operazione di I/O è stata eseguita correttamente. In questo modo, in SQL Server viene ottimizzato l'utilizzo della CPU e delle risorse di I/O per le attività appropriate.

Processo di scrittura differita

Lazywriter è un processo di sistema che mantiene disponibili i buffer liberi rimuovendo dalla cache buffer le pagine utilizzate con meno frequenza. Le pagine dirty vengono scritte per prime nel disco.

Processo di scrittura immediata

Tramite il processo Eager Writer vengono scritte le pagine di dati sporchi associate a operazioni a registrazione minima, ad esempio inserimento massivo e seleziona in. Questo processo consente la creazione e la scrittura di nuove pagine in parallelo. Ovvero, l'operazione chiamante non deve attendere il completamento dell'intera operazione prima di scrivere le pagine su disco.

Processo di checkpoint

Tramite il processo di gestione dei checkpoint viene eseguita periodicamente l'analisi della cache buffer alla ricerca di buffer con pagine di un database specifico e tutte le pagine dirty vengono scritte nel disco. I checkpoint consentono di risparmiare tempo durante un successivo recupero, grazie alla creazione di un punto in cui è certo che tutte le pagine dirty siano state scritte sul disco.

L'utente potrebbe richiedere un'operazione di checkpoint usando il CHECKPOINT comando oppure il motore di database potrebbe generare checkpoint automatici in base alla quantità di spazio del log usato e al tempo trascorso dall'ultimo checkpoint. Viene inoltre generato un checkpoint quando si verificano determinate attività, ad esempio quando un file di dati o di log viene aggiunto o rimosso da un database oppure quando viene arrestata l'istanza di SQL Server.

Per ulteriori informazioni, vedere Controlli di stato e la porzione attiva del log.