Condividi tramite


Scrittura di pagine

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

Quando una pagina viene modificata nella cache buffer, non viene immediatamente riscritta nel disco, ma viene contrassegnata come dirty. Questo significa che possono essere eseguite più scritture logiche di una pagina prima che la pagina stessa venga scritta fisicamente nel 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 nel disco prima che la pagina dirty corrispondente venga rimossa dalla cache buffer e scritta nel disco. In SQL Server viene utilizzata una tecnica denominata log write-ahead che impedisce la scrittura di una pagina dirty prima della scrittura nel disco del record di log associato. Questa procedura è fondamentale per garantire il corretto funzionamento della gestione del recupero. Per ulteriori informazioni, vedere Log delle transazioni write-ahead.

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

Creazione di una pagina di dati modificata

Dopo la scrittura di una pagina tramite Gestione buffer, viene eseguita la ricerca di pagine dirty adiacenti che possano essere incluse in un'unica operazione di scrittura sequenziale. Le pagine adiacenti hanno ID di pagina consecutivi e appartengono allo stesso file, ma non è necessario che siano 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 individuata una pagina dirty il cui numero di sequenza del file di log (LSN) non è ancora stato scaricato nel log.

  • Viene individuata una pagina per la quale non è possibile impostare immediatamente un latch.

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 delle pagine incomplete, è necessario impostare il latch esclusivo (EX) per l'I/O, in quanto questo tipo di protezione comporta la modifica della pagina e rende pertanto inappropriata la lettura da parte di qualsiasi altro thread. Se viene aggiunta la protezione dei checksum della pagina, o se nel database non viene utilizzata alcuna protezione della pagina, è necessario impostare il latch di aggiornamento (UP) per l'I/O, che impedisce la modifica della pagina durante la scrittura ma ne consente l'utilizzo in lettura. Per ulteriori informazioni sulle opzioni di protezione della pagina per quanto riguarda l'I/O, vedere Gestione del buffer.

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

  • Scrittura Lazywriter

    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.

  • Eager Writer

    Tramite il processo Eager Writer vengono scritte le pagine dirty associate a operazioni non registrate, ad esempio inserimento bulk e selezione. Questo processo consente la creazione e la scrittura di nuove pagine in parallelo. Questo significa che l'operazione che ha eseguito la chiamata non deve attendere il completamento dell'intera operazione prima della scrittura delle pagine nel disco.

  • Checkpoint

    Tramite il processo di gestione dei checkpoint viene eseguita periodicamente la scansione 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 nel disco. L'utente può richiedere un'operazione di checkpoint utilizzando il comando CHECKPOINT oppure in Motore di database possono venire generati checkpoint automatici in base alla quantità di spazio del log utilizzato 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 a o rimosso da un database oppure quando viene interrotta l'istanza di SQL Server. Per ulteriori informazioni, vedere Relazione tra i checkpoint e la parte attiva del log.

    I processi di scrittura Lazywriter, Eager Writer e di gestione dei checkpoint non attendono il completamento dell'operazione di I/O. 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.

Vedere anche

Concetti