2009-10-22 2 views
5

저는 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의 배열을 채 웁니다. 빨리.

답변

4

데이터 테이블을 통과하지 마십시오. 한 번에 한 행씩 SqlReader를 사용하여 개체를 만들고 채 웁니다. SqlCommand.ExecuteReader를 시작해야합니다.

+1

SqlReader는 이와 같은 시나리오에 고도로 최적화되어 있습니다. – popester

+0

Mitch : DataAdapter.Fill이 IDataReader를 사용하고 있음을 알고 있습니다. 맞습니까? DataAdapter가 수행하는 유일한 최적화는 CommandBehavior.SequentialAccess를 전달하는 것이며 ExecuteReader에서도 똑같이 쉽게 수행 할 수 있습니다. 멀리 볼 수있는 한, 중개자는 중매인을 잘라냅니다. IDataReader를 사용하는 이유가 직접 느려지는 것을 볼 수 없습니다. – itowlson

+1

@itowlson : 위 코드의 스톱워치는 DataTable이 채워진 후 시작됩니다. –

3

DataTable -> Array 대신 DataReader를 사용하십시오. 데이터 판독기를 사용하여 값을 배열에 직접 쓸 수 있습니다. 그게 더 빠르다고 생각하지 않습니다.

관련 문제