Estoy usando VB.NET..NET - SQL Select -> Array. ¿Cuál es la manera más rápida?
Estoy realizando una consulta de selección que devuelve aproximadamente 2500 filas, cada una con 7 campos.
Estoy usando un SqlDataAdapater y llenando un conjunto de datos con la única tabla devuelta por la consulta Seleccionar (desde la base de datos local). (Solo realizo la recuperación de datos una vez (vea abajo) y ni siquiera comienzo el cronómetro hasta que los datos han llegado)
Estoy iterando a través de esa tabla con un ciclo forzado y rellenando una matriz de objetos con datos.
Estos objetos no son más que estructuras simples para almacenar cada fila de datos.
Solo por diversión, hago esto las 10 veces para tener una buena idea de cuánto tiempo lleva esto ... porque mi uso deseado implicará devolver 250,000 filas en lugar de 2,500.
Necesito acelerar esto.
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)
¿Alguna idea sobre el método más rápido para obtener datos de un SQL Seleccionar directamente en una matriz?
editar: Resultados: El siguiente código se ejecuta en 4 milisegundos en lugar de 2050 milisegundos en una sola iteración del ciclo externo anterior.
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 - Ran una consulta devolver 250.000 resultados y se llena la matriz en 560 ms utilizando el segundo conjunto de código. Eso es rápido.
SqlReader está altamente optimizado para escenarios como este. – popester
Mitch: sabes que DataAdapter.Fill usa un IDataReader bajo las cubiertas, ¿verdad? La única optimización que veo que DataAdapter está haciendo es pasar CommandBehavior.SequentialAccess, y eso se puede hacer igualmente fácilmente con ExecuteReader. Hasta donde puedo ver, Popester está eliminando al intermediario; No veo ningún motivo para usar un IDataReader directamente sería más lento. – itowlson
@itowlson: el cronómetro en el código anterior se inicia después de que se haya llenado la DataTable. –