Sto usando VB.NET..NET - SQL Select -> Array. Qual è il modo più veloce?
Sto eseguendo una query di selezione che restituisce circa 2500 righe, ciascuna contenente 7 campi.
Sto utilizzando un SqlDataAdapater e riempiendo un set di dati con la singola tabella restituita dalla query Seleziona (dal database locale). (Eseguo il recupero dei dati una volta sola (vedi sotto) e non avvio lo StopWatch neanche dopo l'arrivo dei dati)
Sto iterando attraverso quella tabella con un ciclo for e popolando una matrice di oggetti con dati.
Questi oggetti non sono altro che semplici strutture per memorizzare ogni riga di dati.
Solo per divertimento, lo sto facendo tutte le 10 volte per ottenere una buona sensazione per quanto tempo ci vuole ... perché il mio utilizzo desiderato comporterà la restituzione di 250.000 righe invece di 2.500.
Ho bisogno di accelerare.
Dim SW As New Stopwatch
SW.Start()
For j As Integer = 0 To 10
Dim T As DataTable = ds.Tables(0)
Dim BigArray(0 To T.Rows.Count - 1) As MyObj
For i As Integer = 0 To T.Rows.Count - 1
BigArray(i) = New MyObj
BigArray(i).A = T(i)(0)
BigArray(i).B = T(i)(1)
BigArray(i).C = T(i)(2)
BigArray(i).D = T(i)(3)
BigArray(i).E = T(i)(4)
BigArray(i).F = T(i)(5)
BigArray(i).G = T(i)(6)
Next
Next
MsgBox(SW.ElapsedMilliseconds)
Qualche idea sul metodo più veloce per ottenere dati da un SQL Selezionare direttamente in un array?
modifica: Risultati: il seguente codice viene eseguito in 4 millisecondi rispetto a 2050 millisecondi, presi da una singola iterazione del ciclo esterno precedente.
cmd = New SqlCommand("select stuff", conn)
reader = cmd.ExecuteReader()
Dim SW As New Stopwatch
SW.Start()
Dim BigArray(0 To RowCount - 1) As MyObj
Dim i As Integer = 0
While (reader.Read())
BigArray(i) = New MyObj
BigArray(i).A= reader(0)
BigArray(i).B= reader(1)
BigArray(i).C= reader(2)
BigArray(i).D= reader(3)
BigArray(i).E= reader(4)
BigArray(i).F= reader(5)
BigArray(i).G= reader(6)
i += 1
End While
MsgBox(SW.ElapsedMilliseconds)
Edit2: FYI - fatto funzionare una query ritorno 250.000 risultati e popola l'array in 560 ms utilizzando il secondo set di codice. È veloce
SqlReader è altamente ottimizzato per scenari come questo. – popester
Mitch: sei consapevole del fatto che DataAdapter.Fill utilizza un IDataReader sotto le copertine, giusto? L'unica ottimizzazione che vedo fare DataAdapter è il passaggio di CommandBehavior.SequentialAccess, e questo può essere fatto ugualmente facilmente con ExecuteReader. Per quanto posso vedere, il pop-up sta tagliando l'intermediario; Non riesco a vedere alcun motivo usando direttamente IDataReader sarebbe più lento. – itowlson
@itowlson: il cronometro nel codice precedente viene avviato dopo che il DataTable è stato compilato. –