.NET - SQL查询 --> 数组。最快的方法是什么?

5

我正在使用VB.NET。

我执行了一个查询,返回大约2500行,每行包含7个字段。

我使用SqlDataAdapater并使用Select查询从本地数据库填充数据集中的单个表格。(我只执行一次数据检索(见下文),并且在数据到达后才开始计时)

我使用for循环遍历该表,并用数据填充对象数组。

这些对象只是简单的结构,用于存储每行数据。

只是为了好玩,我做了10次这样的操作,以便更好地了解需要多长时间...因为我的预期用途将涉及返回250,000行而不是2,500行。

我需要加快速度。

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)

有没有最快的方法将SQL Select中的数据直接获取到数组中?

编辑:结果:以下代码执行时间为4毫秒,而上述外部循环的单次迭代需要2050毫秒。

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)

编辑2: FYI - 运行一个返回250000个结果的查询,使用第二组代码在560毫秒内填充了数组。这很快。

2个回答

4
不要使用数据表格。使用SqlReader逐行读取每行数据,创建对象并填充数据。SqlCommand.ExecuteReader应该能够帮助您开始操作。

1
SqlReader 高度优化,适用于此类场景。 - popester
Mitch:你知道DataAdapter.Fill在底层使用IDataReader,对吧?我唯一看到DataAdapter做的优化就是传递CommandBehavior.SequentialAccess,而这同样可以通过ExecuteReader轻松完成。就我所见,popester是直接去掉中间人;我看不出直接使用IDataReader会更慢的任何理由。 - itowlson
1
@itowlson:上述代码中的秒表是在填充 DataTable 后启动的。 - Mitch Wheat
这个答案是正确的,并且导致了数个数量级的加速。 - Brian Webster

3
使用DataReader代替DataTable -> Array。使用数据阅读器,您可以直接将值写入数组中。我认为没有比这更快的了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接