2009-10-22 14 views
5

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.

Respuesta

4

No vaya a la tabla de datos. Use un SqlReader para leer cada fila de a una por vez, cree el objeto y rellene. SqlCommand.ExecuteReader debería comenzar.

+1

SqlReader está altamente optimizado para escenarios como este. – popester

+0

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

+1

@itowlson: el cronómetro en el código anterior se inicia después de que se haya llenado la DataTable. –

3

Use un DataReader en lugar de un DataTable -> Array. Usando el lector de datos puede escribir los valores directamente en la matriz. No creo que sea más rápido que eso.

Cuestiones relacionadas