Domanda

Quanti InsertOnSubmit Devo chiamare prima di chiamare SubmitChanges? Sto aggiungendo i dati da un servizio web in grado di restituire decine di migliaia di record un record alla volta. La classe wrapper per il servizio Web espone i record una collezione un IEnumberable per nascondere un meccanismo di suddivisione in blocchi elaborato.

Ci sono linee guida su quanti inserti dovrei accumulare prima di sottoporle?

È stato utile?

Soluzione

Dipende anche dal tipo di dati che è necessario inserire. A volte ho bisogno di inserire un sacco di dischi, dove ho anche bisogno l'ID di, per inserire più record in un'altra tabella.

Poiché l'ID viene assegnato quando si invia le modifiche al database, ho bisogno di chiamare SubmitChanges su tempi specifici.

Quando questo non è necessario, ho appena li presenta con un 1000 in una sola volta o giù di lì (a seconda del numero totale di record ho bisogno di inserire).

Forse si potrebbe fare qualche test di velocità, che sono meglio per voi. A seconda dell'hardware, le aspettative di quantità di record, ecc.

Altri suggerimenti

Bene ho fatto con centinaia di migliaia di record su più tavoli in un colpo solo, senza un problema. Infatti, mentre chiamando SubmitChanges () per ogni InsertOnSubmit () in un caso del genere sarebbe ora, basta chiamare SubmitChanges () proprio alla fine sarebbe ridurre il tempo necessario per inserire che molti record per un paio di minuti.

Nel caso ho descritto sopra, la disposizione che avevo era per tabelle di rapporto con una tabella di intestazione, dettagli tavolo (che collegato a intestazione) e una tabella atomo (che collegato a dettagli). Per ogni record di intestazione, ho avuto più tabelle di dettaglio che sarebbe poi di nuovo essere collegati con più record atomo. In alcuni casi, sarei andato a finire l'inserimento di gazillions di dischi e che avevano tutti vanno di problemi con i singoli SubmitChanges () chiamata al termine e tutto è comportato molto bene.

Per apportare modifiche a un campo per 1000 record in lotti vs 1 alla volta: 1 record alla volta prende 0,1989 sec / registrazione vs lotto che prende 0,0711 sec / record. Quindi Batch è circa 3 volte più veloce nel mio test. Si noti che le dimensioni dei lotti variano in termini di efficienza.

SubmitChanges () 1 record alla volta
registra sec sec / record
1000 198.95 0,1989

SubmitChanges batch ()
registra sec sec / Cambia scheda%
100 12.20 0,1220 133%
200 18.33 0,0916 122%
500 37.59 0,0752 106%
1.000 71,07 0,0711 103%
2.000 138,64 0,0693 102%
10.000 680,36 0,0680

Non ci sono davvero tutti "Linee guida" per-dire. Id direbbe per l'efficienza che ci si vuole raccogliere un gruppo, forse non 10k, ma dire 100? Che sarebbe drasticamente ridurre il DB query e non deve mangiare troppo ram loro cache in locale, mentre si costruisce una transazione.

Si dovrebbe probabilmente prova con un paio di valori diversi e il profilo delle prestazioni (memoria e velocità) per trovare la soluzione ottimale per l'hardware però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top