2013-05-08 3 views
5

Ho un database abbastanza grande con ~ 2,6 milioni di documenti in cui ho due raccolte ogni 1,2 milioni e resto sono piccole collezioni (< 1000 documenti). Quando creo un nuovo indice per la piccola raccolta, è necessario molto tempo per completare l'indicizzazione (quindi gli indici temporanei sono inutili). Sembra che il processo di indicizzazione RavenDB legga ogni documento nel DB e controlli se dovrebbe essere aggiunto all'indice. Penso che potrebbe funzionare meglio per indicizzare solo le raccolte utilizzate dall'indice.Perché RavenDB legge tutti i documenti nel processo di indicizzazione e non solo le raccolte utilizzate dall'indice?

Anche quando si utilizza Smuggler per esportare i dati e voglio esportare solo una piccola raccolta, legge tutti i documenti e l'esportazione potrebbe richiedere molto tempo. La stessa app personalizzata che utilizza API e indici RavenDB Linq può esportare i dati in pochi secondi.

Perché RavenDB si comporta in questo modo? E forse c'è qualche impostazione di configurazione che potrebbe cambiare questo comportamento?

+0

Vorrei squadra Raven aggiungerebbe una lista opzionale di "Collection" per definizione dell'indice. Se l'elenco è vuoto, il processo di indicizzazione funziona così com'è. Tuttavia, se tale lista è definita, solo le raccolte da tale elenco dovrebbero essere considerate per indice. Migliorerebbe notevolmente le prestazioni e dovrebbe essere molto semplice da implementare. Abbiamo problemi simili con Smuggler. La nostra implementazione utilizza Raven-Entity-Name ma con un filtro di raccolta ed è significativamente più veloce di Smuggler. –

risposta

1

Sembra che la risposta alla mia domanda sia in arrivo in RavenDB 3.0. Ayende dice:

In RavenDB 2.x, si devono ancora pagare il prezzo pieno per l'indicizzazione tutto, ma che non è il caso in RavenDB 3.0. Quello che abbiamo fatto è di ottimizzare efficacemente il processo in modo che in questo caso, precaricare tutti i documenti che prendono parte alla raccolta rilevante, e inviarli direttamente per essere indicizzati.

Facciamo questo utilizzando l'indice Raven/DocumentsByEntityName. Quale ha già indicizzato tutto nel database comunque. Questa è una bella funzionalità di , perché ci consente di sfruttare davvero il lavoro di che abbiamo già fatto molto tempo fa. L'utilizzo di un indice per precompilare un altro è un trucco accurato e di cui sono molto felice.

E qui è pieno post del blog: http://ayende.com/blog/165923/shiny-features-in-the-depth-new-index-optimization

3

RavenDB in realtà non ha alcun concetto reale di "raccolta". Tutti i documenti sono praticamente gli stessi. Analizza semplicemente i metadati Raven-Entity-Name in ciascun documento per determinare come raggruppare le cose per scopi di query per tipo e per visualizzare la pagina "Raccolte" nello studio di gestione.

Non sono sicuro delle motivazioni specifiche per questo. Penso che abbia qualcosa a che fare con le sottostanti tabelle ESENT utilizzate dal negozio di documenti. Forse Ayende può rispondere meglio. I tuoi casi d'uso specifici sono buoni esempi del perché potrebbero essere fatti in modo diverso.

Una cosa che si potrebbe provare è utilizzare più database. Puoi mettere i tuoi documenti di grandi quantità in un unico database e mettere tutto il resto in un altro. Naturalmente, potresti avere problemi con i documenti relativi all'indicizzazione, la multi-mappa/riduzione o altri scenari in cui i documenti di tipi diversi devono stare insieme sullo stesso database.

Problemi correlati