2015-06-05 12 views
5

Attualmente sto lavorando con un database un po 'più grande, e anche se non ho problemi specifici, vorrei alcune raccomandazioni, se qualcuno ne ha.Consigli di prestazione H2

Il database è 2,2 gigabyte (dopo la ricreazione/compattazione). Contiene circa 50 tavoli. Una di queste tabelle contiene un blob più alcuni metadati. Attualmente ha circa 22000 file. Se rimuovo i BLOB dalla tabella (tabella UPDATE SET blob = null), la dimensione del database viene ridotta a circa 200 megabyte (dopo la ricreazione/compattazione). Si accede ai metadati molto, ma i BLOB non sono spesso necessari.

L'URL del database attualmente utilizzo è:

jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288 

Si corre nel nostro Java VM che ha 4GB massimo mucchio.

Alcune cose mi chiedevo:

  • Sarebbe esecuzione H2 in un processo separato avere alcun impatto sulle prestazioni (in meglio o in peggio)?
  • Potrebbe essere utile avere i BLOB in una tabella separata con una relazione 1-1 con i metadati? Potrei immaginare che sarebbe d'aiuto con il caching, non avendo il blob nel modo in cui?
  • Internet sembra diviso sull'opportunità di includere i BLOB in un database o scriverli su file su un filesystem con un collegamento nel DB. Qualche consiglio specifico per H2 qui?

risposta

2

La risposta dipende dal tasso di crescita dei dati BLOB. Se, per esempio, il set di dati crescerà del 10% a settimana, allora non ha senso tentare di estendere l'uso di H2 per archiviare i dati di blob (dato che esaurirà rapidamente la memoria heap disponibile). Se invece i dati blob sono il più grande che sia mai stato, tentare di utilizzare H2 potrebbe avere senso.

Per rispondere alle domande relative H2:

1) Esecuzione di H2 in un processo separato permetterà H2 sostengono la maggior parte dello spazio heap - rendendo controllare lo spazio disponibile per heap H2 molto più gestibile. Tuttavia, aggiungerai anche il sovraccarico di manutenzione per avere un processo separato da mantenere e monitorare. Quindi la risposta è "dipende dal tuo ambiente operativo e dai tuoi obiettivi". Se hai le persone e tempo, l'esecuzione di H2 in un processo separato potrebbe avere senso. Ma se è vero, allora probabilmente dovresti prendere in considerazione solo l'esecuzione di una piattaforma di storage blob appropriata.

2) Sì, è corretto che l'archiviazione dei BLOB in una tabella separata possa essere d'aiuto con la memorizzazione nella cache, nel caso in cui non siano spesso necessari i BLOB. Dovrebbe anche aiutare con i tempi di recupero, in quanto H2 non dovrà leggere oltre i BLOB per trovare i metadati.

3) Si noti che "Internet" rappresenta molte migliaia di persone con quasi altrettanti casi di utilizzo specifici. Dovrai filtrare il tuo caso d'uso in requisiti, e quindi applicare la logica che tieni dagli altri.

4) Il mio consiglio personale è, se si sta tentando di creare una piattaforma scalabile e manutenibile, utilizzare gli strumenti giusti. H2, o qualsiasi altro database relazionale, spesso non è lo strumento giusto per archiviare molti blob di grandi dimensioni. Ti consigliamo di esaminare l'utilizzo di un archivio di chiavi/valori.