2010-05-13 9 views

risposta

55

Ho partecipato alla valutazione beta del codice SQLite BDB e una delle cose che ho cercato di gestire è stata la differenza di prestazioni. A questo punto, Non riesco a pubblicare esattamente quello che ho trovato fino a quando non ho almeno un'altra persona valutare il mio codice, eseguire i test e confermare i numeri che ho ricevuto (che è stato effettuato ). Tuttavia, posso generalizzare qui e dire che ci sono casi in cui BDB offre miglioramenti significativi delle prestazioni su SQLite, in particolare nell'area di gestione di carichi pesanti che coinvolgono la concorrenza di scrittura.

ci sono, in genere, due misure di diritto "fast" - (1) efficienza: quanto tempo ci vuole per un singolo processo per fare XYZ vs. (2) concorrenza: quante volte can molti processi fai XYZ per unità di tempo. Il problema principale degli indirizzi BDB è la concorrenza - elaborazione di transazioni su larga scala. Pertanto, si pensa a molte connessioni simultanee che scrivono e/o modificano il contenuto del database.

SQLite by design utilizza il blocco a livello di database in modo che vi sia un massimo di uno scrittore che può funzionare nel database alla volta. Pertanto, la transazione della transazione di SQLite rimane più o meno costante con il numero di connessioni simultanee, quindi la scalabilità nelle applicazioni ad alta intensità di scrittura è misurata in realtà dall'efficienza (1).

BDB invece utilizza il blocco a livello di pagina, che consente a più autori a lavorare nel database in un determinato momento (purché stanno lavorando pagine separate). Quindi il tasso di BDB aumenta potenzialmente con il numero di connessioni e quindi la sua scalabilità è sia una questione di efficienza (1) che di concorrenza (2), che può sommarsi.

Principalmente ciò che si riduce è la concorrenza (scrittura). BDB può inviare più TPS rispetto a SQLite per più writer. Per transazione, intendo qualcosa che modifica il database (come sono di qualsiasi aiuto reale per le operazioni di sola lettura?). Detto questo, per la concorrenza in lettura (app che fanno principalmente SELECT), SQLite potrebbe benissimo andare testa a testa con BDB perché il blocco non è più un problema critico.

Per quanto riguarda la dimensione del set di dati, non sono sicuro. Non ho esaminato lo . In definitiva, entrambi usano B-tree per l'archiviazione. Potrebbero esserci dei fattori in da considerare nelle rispettive implementazioni, ma non l'ho studiato. I sa che SQLite può gestire con garbo set di dati in centinaia di MB e GB a doppia cifra (e forse più ora che l'implementazione della mappa di pagina sporca è stata modificata).

Pertanto, se si dispone di un'applicazione che utilizza molte connessioni che modificano un determinato database e il conflitto di pagine è relativamente basso, BDB può offrire miglioramenti significativi delle prestazioni di . Ma la contesa di pagina è una variabile importante . Nel limite, se disponevi di un database BDB i cui dati consistevano in una singola pagina , le sue prestazioni corrispondevano a quelle di SQLite in tutti i casi perché il blocco a livello di pagina qui degenera effettivamente nell'equivalente del blocco di livello di database - tutti sta combattendo per una cosa. Tuttavia, poiché il numero di pagine aumenta in BDB (e il conflitto di pagine diminuisce), il TPS massimo inizierà a crescere con il numero di connessioni simultanee. Quindi da quel punto, la memoria diventa il prossimo fattore limitante. Ma questa è un'altra storia di .

BTW, sono in procinto di scrivere un articolo sull'utilizzo di BDB per quelli in arrivo da SQLite .

link articolo:

Oracle Berkeley DB SQL API vs. SQLite API – A Technical Evaluation

Oracle Berkeley DB SQL API vs. SQLite API – Integration, Benefits and Differences

+3

Come viene questo articolo? –

+1

Tornato un po 'indietro. È fuori dalle mie mani ora. Non so quando, dove sarà pubblicato. Potrei sentire qualcosa la prossima settimana. –

+2

Ecco i due white paper dall'articolo: http://www.oracle.com/technetwork/database/berkeleydb/learnmore/bdbvssqlite-wp-186779.pdf http://www.oracle.com/technetwork/database/berkeleydb /learnmore/bdbvssqlite-wp-186779.pdf –

10

Questa è una domanda carica. I risultati sarebbero variare notevolmente a seconda delle velocità di accesso al disco, dimensione della cache in memoria, il numero di inserti contro leggono, divisioni di pagina, la concorrenza, ecc, ecc, ecc

Nel complesso, BerkeleyDB può essere estremamente veloce - Di recente ho progettato una piattaforma di analisi dei dati per un datore di lavoro che fosse in grado di eseguire 40k inserti al secondo su un sistema x86 a 8 core (mentre allo stesso tempo eseguiva migliaia di letture al secondo) con un set di dati nell'intervallo 30G. Questo era con la piena protezione transazionale.

Questo era il caso migliore, tuttavia - c'erano tempi in cui gli inserti potevano scendere fino a 2k al secondo, a seconda dei dati in arrivo e di quello che era attualmente memorizzato in Berkeley. Le prestazioni si riducono in modo significativo se si dispone di I/O su disco lento e di una percentuale di hit della cache insufficiente o si espande costantemente il DB causando la divisione delle pagine. C'è anche un'enorme quantità di tuning che puoi fare per aumentare le prestazioni per il tuo set di dati particolare.

Nel complesso è un sistema eccellente, ma la documentazione e la conoscenza sono piuttosto ridotte. Raccomando The BerkeleyDB Book come probabilmente il miglior riferimento attualmente disponibile.

6

Oltre alla Berkeley DB Libro che Brian cita, si può anche trovare le seguenti risorse utili:

  • I I forum online di Berkeley DB possono fornire molti suggerimenti sia da parte degli utenti sia gli sviluppatori del prodotto. Vedi Berkeley DB forum,
  • Il set di documentazione Berkeley DB, che può essere trovato here. In particolare, ci sono diverse sezioni nella Guida di riferimento che riguardano la messa a punto, le prestazioni e il rendimento.
Problemi correlati