popolamento incrementale di una tabella da file .csv
-
venerdì 3 agosto 2012 08:03
ciao a tutti.
Ho questa situazione: da un file .csv devo popolare una tabella di un DB SQL Server 2008.
I campi interessati sono 7: 3 string, 1 long, 1 DateTime, 2 double (nchar, bigint, datetime, float su Sql, mi pare)
Il file può essere molto grosso (decine di migliaia di righe) e di conseguenza la tabella,
che potrebbe rapidamente raggiungere le centinaia di migliaia.I record presenti nel file devono essere aggiunti solo se non già presenti nella stessa.
Purtroppo i record inseriti non hanno una chiave primaria, quindi è possibile che in tabella
vengano inseriti più record uguali,
quindi a livello applicativo applico la logica per cui se ho già dei record in tabella con la stessa combinazione di 4 dei campi (string, long datetime e string)
della riga file non li scrivo.Vorrei possibilmente svolgere questa operazione nel contesto di un'applicazione ASP.NET (quindi con un timeout di circa 30 secondi)
ma non sono obbligato (posso quindi svolgere l'operazione in modo asincrono, persistendo temporaneamente i dati del file in qualche modo).Sto provando varie strade (EF, DataTable, SqlBulk) ma ho difficoltà a capire quale sia la più efficiente
anche una volta che la tabella sia diventata molto grande.Ringrazio chi potrà darmi qualche dritta.
Tutte le risposte
-
mercoledì 15 agosto 2012 12:37
Mi vengono in mente 2 possibili strade:
- Chiamate multiple di insert:
Chiama la funzione "Prepare()" per velocizzare un po': http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx - Utilizzare un DataAdapter impostando UpdateBatchSize>1
Per evitare di effettuare chiamate multiple a server: http://msdn.microsoft.com/en-us/library/aadf8fk2.aspx
Ad occhio e croce dovrebbe essere il metodo più rapito.
Il controllo dei duplicati potresti demandarlo a sqlserver creando una uniquekey (oppure leggere tutto se sai che le righe da inserire sono poche).
In generale, non usare EF per fare insert massivi, gli ORM non sono pensati per questo (se proprio vuoi provarlo prova a impostare Context.Configuration.AutoDetectChangesEnabled a false).
- Contrassegnato come risposta Alessandro Lendaro lunedì 17 settembre 2012 09:11
- Chiamate multiple di insert:

