저는 VB.NET을 사용하고 있습니다..NET - SQL 선택 -> 배열. 가장 빠른 방법은 무엇입니까?
각각 약 7 개의 필드가 포함 된 약 2500 개의 행을 반환하는 select 쿼리를 수행하고 있습니다.
저는 SqlDataAdapater를 사용하고 Select 쿼리에서 반환 된 단일 테이블 (로컬 데이터베이스에서)으로 데이터 집합을 채 웁니다. (나는 데이터 검색을 한 번만 수행하고 (아래 참조) 데이터가 도착할 때까지 StopWatch를 시작하지 않습니다.)
for 루프를 사용하여 해당 테이블을 반복하고 객체 배열을 채 웁니다. 데이터.
이러한 개체는 각 데이터 행을 저장하는 단순한 구조에 지나지 않습니다.
즐거운 시간을 위해서,이 모든 작업을 10 번 반복하면됩니다. 필자가 원하는대로 2,500 대신 250,000 개의 행을 반환하기 때문에 시간이 많이 걸릴 것입니다.
나는 이것을 빠르게 할 필요가있다.
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에서 데이터를 가져 오는 가장 빠른 방법에 대한 아이디어는 배열로 직접 선택 하시겠습니까?
편집 : 결과 : 다음 코드는 위 외부 루프의 단일 반복에 의해 취해진 2050 밀리 초가 아니라 4 밀리 초 단위로 실행됩니다.
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가 : 참고 - 250000 개 결과를 반환하는 쿼리를 실행하고이 코드의 두 번째 세트를 사용하여 560ms의 배열을 채 웁니다. 빨리.
SqlReader는 이와 같은 시나리오에 고도로 최적화되어 있습니다. – popester
Mitch : DataAdapter.Fill이 IDataReader를 사용하고 있음을 알고 있습니다. 맞습니까? DataAdapter가 수행하는 유일한 최적화는 CommandBehavior.SequentialAccess를 전달하는 것이며 ExecuteReader에서도 똑같이 쉽게 수행 할 수 있습니다. 멀리 볼 수있는 한, 중개자는 중매인을 잘라냅니다. IDataReader를 사용하는 이유가 직접 느려지는 것을 볼 수 없습니다. – itowlson
@itowlson : 위 코드의 스톱워치는 DataTable이 채워진 후 시작됩니다. –