2012-05-06 8 views
11

Recentemente ho avuto diverse situazioni in cui ho bisogno di dati diversi dalla stessa tabella. Un esempio è dove vorrei scorrere ogni "driver di consegna" e generare un file PDF stampabile per ogni cliente a cui consegnare.È più veloce interrogare un elenco <T> o un database?

In questa situazione, ho tirato tutti i clienti e li immagazzinate in

List<Customer> AllCustomersList = customers.GetAllCustomers(); 

Come ho in loop con i driver di consegna, mi piacerebbe fare qualcosa di simile:

List<Customer> DeliveryCustomers = AllCustomersList.Where(a => a.DeliveryDriverID == DriverID); 

La mia domanda è: il modo in cui lo faccio interrogando l'oggetto List più rapidamente di una query sul database ogni volta per i record dei clienti associati al driver di consegna?

+0

Non riesco a immaginare un modo per estrarre dati dal database sarebbe meglio che fare tutto in memoria come lo stai facendo attualmente ... L'unica cosa che posso pensare è di non tirare più dati allora stanno per usare ... – Jared

+1

Interrogare una lista dovrebbe essere molto, molto più veloce dato che verrebbe memorizzato. – xbonez

+0

A che punto diventeranno troppi dati da inserire nell'elenco e sarà necessario utilizzare il database? – Ricketts

risposta

11

Non c'è un numero preciso per la quantità di righe che, se si passa si dovrebbe interrogare il DB invece di in-memory List<T>

Ma la regola generale è, DB sono progettati per lavorare con grandi quantità di dati e hanno "meccanismi" di ottimizzazione mentre in memoria non ci sono cose del genere.

Quindi dovrai punto di riferimento per vedere se l'andata e ritorno a DB è valsa la pena per tale importo di righe per ogni volta che è importante per voi

"Dobbiamo dimenticare le piccole efficienze, dire circa il 97% del tempo: prematura ottimizzazione è la radice di ogni male "

+0

Grazie! Quella frase mi ha fatto riconsiderare il mio approccio! +1 –

1

evitare round trip al DB è una delle principali norme in materia di database di ottimizzazione delle prestazioni, soprattutto quando il DB si trova in rete e ha più utenti che accedono a i t.

Dall'altro punto di vista, portare in memoria grandi insiemi di risultati come i dati dei clienti sembra essere, non è efficiente e probabilmente non è più veloce di un viaggio in DB quando ne avete bisogno.

Un buon utilizzo delle raccolte di memoria per evitare round trip è per le tabelle di ricerca (ovvero categorie di clienti, aree clienti, ecc.) Che non cambiano spesso. In questo modo eviti i join nella query di selezione del cliente principale rendendola ancora più veloce.

0

Perché non utilizzare Redis? , È un database in memoria ed è molto veloce.

Problemi correlati