.NET - Выбор SQL -> Массив. Какой самый быстрый способ? - PullRequest
5 голосов
/ 22 октября 2009

Я использую VB.NET.

Я выполняю запрос на выборку, который возвращает примерно 2500 строк, каждая из которых содержит 7 полей.

Я использую SqlDataAdapater и заполняю набор данных одной таблицей, возвращаемой запросом Select (из локальной базы данных). (Я выполняю поиск данных только один раз (см. Ниже) и даже не запускаю секундомер до тех пор, пока данные не поступят)

Я перебираю эту таблицу с помощью цикла for и заполняю массив объектов данными.

Эти объекты - не что иное, как простые структуры для хранения каждой строки данных.

Просто для забавы, я делаю это все 10 раз, чтобы понять, сколько времени это займет ... потому что мое желаемое использование будет включать в себя возвращение 250 000 строк вместо 2500.

Мне нужно ускорить это.

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 непосредственно в массив?

edit: Результаты: следующий код выполняется за 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)

Edit2: FYI - Запустил запрос, возвращающий 250 000 результатов, и он заполняет массив за 560 мс, используя второй набор кода. Это быстро

Ответы [ 2 ]

4 голосов
/ 22 октября 2009

Не просматривайте таблицу данных. Используйте SqlReader, чтобы читать каждую строку по одному, создавать объект и заполнять его. SqlCommand.ExecuteReader должен помочь вам начать работу.

3 голосов
/ 22 октября 2009

Используйте DataReader вместо DataTable -> Array. Используя устройство чтения данных, вы можете записать значения непосредственно в массив. Я не думаю, что это становится быстрее, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...