2009-10-22 16 views
5

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

risposta

4

Non passare attraverso la tabella dati. Utilizzare un SqlReader per leggere ogni riga una alla volta, creare l'oggetto e popolarlo. SqlCommand.ExecuteReader dovrebbe iniziare.

+1

SqlReader è altamente ottimizzato per scenari come questo. – popester

+0

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

+1

@itowlson: il cronometro nel codice precedente viene avviato dopo che il DataTable è stato compilato. –

3

Utilizzare un DataReader invece di un DataTable -> Array. Usando il lettore di dati è possibile scrivere i valori direttamente nell'array. Non penso che sia più veloce.

Problemi correlati