Conosco le basi del perché un database utilizza un log delle transazioni: proprietà ACID, capacità di rollback / ripristino ecc.
L'algoritmo di base che vedo per una transazione è il seguente:
-
La transazione
- modifica i dati: le pagine dei dati vengono cambiate nella memoria
- il log delle transazioni viene scritto su disco (deve accadere prima che venga registrato il commit)
- il commit è stato emesso
- le pagine di dati vengono scritte sul disco in modo asincrono
In teoria, ciò significa che si salvano le operazioni di I / O perché non è necessario attendere che le pagine di dati vengano scritte su disco prima di un commit. Devi solo attendere che il log finisca di essere scritto perché la transazione può essere rifatta dal log se si verifica un arresto anomalo prima che vengano scritte le pagine di dati. Tuttavia, se il log delle transazioni deve memorizzare valori prima / dopo o almeno tutti i nuovi dati che sono stati modificati nelle pagine di dati, in che modo questo salva I / O? Non richiederebbe la stessa quantità di tempo per non memorizzare le modifiche dei dati nel log e attendere che le pagine di dati vengano scritte in modo sincrono?
Ad esempio, se la mia transazione apporta 10 MB di modifiche ai dati, non impiegherebbe la stessa quantità di tempo per scrivere 10 MB di modifiche al log, in quanto vorrebbe solo aspettare e scrivere quei 10 MB di pagine di dati sul disco? A che serve anche archiviare i dati modificati nel registro?