Gli sviluppatori del progetto SQLite hanno avviato i test per un backend sperimentale chiamato HCtree, che supporta il blocco a livello di righe e garantisce un elevato grado di parallelismo nell'elaborazione delle query. Il nuovo backend mira a migliorare l'efficienza dell'uso di SQLite nei sistemi client-server, dove è necessario gestire un elevato numero di richieste simultanee per la scrittura nel database.
Le strutture b-tree, originariamente utilizzate in SQLite per la memorizzazione dei dati, non sono progettate per questo tipo di carico, il che limita SQLite alla scrittura in un unico thread. Come esperimento, gli sviluppatori hanno iniziato a sviluppare una soluzione alternativa che utilizza la struttura HC-tree per la memorizzazione, più adatta alla parallelizzazione delle operazioni di scrittura.
Per organizzare l'esecuzione simultanea di più operazioni nelle scritture HCtree, viene utilizzato un meccanismo di separazione delle transazioni, che utilizza blocchi a livello di pagina e similare al MVCC (Multi-Version Concurrency Control), ma controlla le transazioni basandosi su chiavi e intervalli di chiavi invece che su insiemi di pagine. Le operazioni di lettura e scrittura sono legate a uno snapshot del database, le cui modifiche diventano visibili nel database principale solo al termine della transazione.
I clienti possono utilizzare tre operazioni per l'apertura delle transazioni:
- «BEGIN» — le transazioni non considerano i dati di accesso da parte di altri clienti. Se durante l'esecuzione della transazione vengono effettuate operazioni di scrittura, la transazione può essere confermata solo se non ci sono state altre operazioni di scrittura nel database durante il suo completamento.
- «BEGIN CONCURRENT» — le transazioni raccolgono informazioni sull'accesso da altri clienti. Se all'interno della transazione vengono effettuate operazioni di scrittura, la transazione può essere confermata se, dall'epoca della creazione dello snapshot, sono state confermate altre transazioni.
- «BEGIN EXCLUSIVE» — dopo l'apertura, la transazione blocca le operazioni di altre transazioni fino al suo completamento.
HCtree supporta la replica in stile «master-slave», che consente di trasferire transazioni in un altro database e mantenere i database secondari in uno stato sincronizzato con il database principale. HCtree elimina anche il limite alla dimensione del database: invece di identificatori a 32 bit per le pagine di dati, HCtree utilizza identificatori a 48 bit, aumentando la dimensione massima del database da 16 tebibyte a 1 exbibyte (un milione di tebibyte). Si prevede che le prestazioni di SQLite con il backend HCtree siano almeno pari a quelle del classico backend a thread singolo. I clienti di SQLite con supporto per HCtree potranno accedere sia ai database basati sulla struttura HC-tree sia ai vecchi database SQLite.
Fonte: opennet.ru
