Lentezza ado.net 2.0

martedì 17 giugno 2008 - 16.35

alessio1783 Profilo | Newbie

Salve, non so se è la sezione giusta del forum, io cmq ci provo:
Ho il seguente problema:
Ho notato una lentezza mostruosa di ado net, in special modo nei metodi fill e update dei data adapter (siano essi sqldataadapter o tableadapter).
Ho fatto una prova con Vb6 e il vecchio DAO e vb2005 e ado net 2.0, nella quali vado a inserire 100000 record in una sola tabella con un solo campo.
Il risultato è che Vb6 è istantaneo, mentre vb2005 ci mette 2 minuti. Come mai questa lentezza? lo so che 100000 record sono tanti da gestire, ma a volte capita di doverli caricare tutti nel data set. Come posso fare per velocizzare queste operazioni?
Posto il codice di VB2005 che ho usato:

----------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Label1.Text = Now
Dim ds As New dbprovaDataSet
Dim tab As dbprovaDataSet.tabella1DataTable = ds.tabella1
Dim riga As dbprovaDataSet.tabella1Row

Dim i As Integer = 0

For i = 1 To 100000
riga = tab.Newtabella1Row
riga.campo = i
tab.Addtabella1Row(riga)
Next
Me.Label2.Text = Now
adap.Update(tab)
Me.Label3.Text = Now
MsgBox("fine")

End Sub
---------------------------

Grazie per le eventuali risposte.

lbenaglia Profilo | Guru

>Ho fatto una prova con Vb6 e il vecchio DAO e vb2005 e ado net
>2.0, nella quali vado a inserire 100000 record in una sola tabella
>con un solo campo.
>Il risultato è che Vb6 è istantaneo, mentre vb2005 ci mette 2
>minuti. Come mai questa lentezza?

Ciao Alessio,

Per eseguire inserimenti massivi in modo efficiente, puoi affidarti alla classe SQLBulkCopy presente nel Framework .NET 2.0.
Questo articolo confronta il classico approccio "row-by-row" con un inserimento BULK:
http://www.sqlteam.com/article/use-sqlbulkcopy-to-quickly-load-data-from-your-client-to-sql-server

>Grazie per le eventuali risposte.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alessio1783 Profilo | Newbie

il mio era solo un test e ado mi è sembrata + lenta. Apparte quella soluzione, secondo te per trattare moli molto grandi di dati che cosa conviene usare? dataset tipizzati? non tipizzati? altro?

grazie mille...

lbenaglia Profilo | Guru

>il mio era solo un test e ado mi è sembrata + lenta. Apparte
>quella soluzione, secondo te per trattare moli molto grandi di
>dati che cosa conviene usare? dataset tipizzati? non tipizzati?
>altro?
Operazioni Bulk Logged (BCP, BULK INSERT, "quella soluzione"). Punto

>grazie mille...
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alessio1783 Profilo | Newbie

Operazioni Bulk Logged (BCP, BULK INSERT, "quella soluzione"). Punto ovvero?

Da quello che ho capito una operazione bulk è diciamo come un batch che legge da una parte e scrive dall'altra.
Ma se io devo farci operazio sui dati? tipo copiare solo una certa parte di dati da una tabella all'altra? oppure copiarli ma modificando qualche campo?...ad esempio metti che io debba copiara tutti i record da A a B a messo che il campo "bloccato" sia su false. Tu come faresti con un'operazione bulk? scusa se sono un po duro di comprendonio...Ti ringrazio ancora.
Ciao.

lbenaglia Profilo | Guru

>Da quello che ho capito una operazione bulk è diciamo come un
>batch che legge da una parte e scrive dall'altra.
>Ma se io devo farci operazio sui dati? tipo copiare solo una
>certa parte di dati da una tabella all'altra? oppure copiarli
>ma modificando qualche campo?...ad esempio metti che io debba
>copiara tutti i record da A a B a messo che il campo "bloccato"
>sia su false. Tu come faresti con un'operazione bulk?
Non puoi applicare dei filtri durante una operazione bulk.
Una soluzione che generalmente si adotta è quella di caricare i dati in modalità bulk in una tabella di staging, applicando a quest'ultima tutte le logiche necessarie al popolamento delle tabelle di destinazione.

>scusa se sono un po duro di comprendonio...Ti ringrazio ancora.
Ma figurati

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alessio1783 Profilo | Newbie

Sinceramente non vedo il vantaggio...forse allora mi conviene usare insertinto....

lbenaglia Profilo | Guru

>Sinceramente non vedo il vantaggio...forse allora mi conviene
>usare insertinto....
Il vantaggio è che le operazioni Bulk sono minimamente loggate e risultano n ordini di grandezza più efficienti rispetto ad una normale operazione DML loggata.
Quindi, importi tutti i dati in modalità bulk in una tabella di appoggio, elabori i dati come credi ed importi il risultato nelle tabelle di destinazione.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5