SqlCeDataReader.Read работает медленно

У меня есть приложение vb.net, которое вызывает большое количество данных (около 65 000 строк) из двух таблиц в базе данных SQL Server CE.

Код довольно прост:

cmd.CommandText = "SELECT [Table1Col1], [Table1Col2], ... [Table1Col8], " & _
                  "[Table2Col1], [Table2Col2] FROM [Table1] LEFT JOIN [Table2] " & _
                  "ON [Table1].[LinkCol] = [Table2].[LinkCol] WHERE [Table1Col8] = 0 " & _
                  "ORDER BY [Table1].[LinkCol]"

reader = cmd.ExecuteReader()

Do While reader.read
     [read data, format it, etc]
Loop

reader.read утверждение, безусловно, занимает больше всего времени для выполнения. Для считывания и обработки 65 000 строк требуется около 2 часов, и, по моим оценкам, около 60-70% этого объема обусловлено отставанием в reader.read заявление.

Есть ли способ ускорить это?

РЕДАКТИРОВАТЬ:

Я сделал некоторые измерения времени, и reader.read оператор занимает в 150 раз больше (в среднем), чем блок кода, где я читаю, форматирую и т. д.

1 ответ

Решение

Проблема, кажется, из-за LEFT JOIN в операторе sql. Я значительно ускорился, выполнив два считывателя, по одному для каждой таблицы, и синхронизировал их в коде. Что-то вроде следующего:

cmd1.CommandText = "SELECT [LinkCol], [Table1Col1], [Table1Col2], ... [Table1Col8] " & _
                  "FROM [Table1] WHERE [Table1Col8] = 0 ORDER BY [Table1].[LinkCol]"

cmd2.CommandText = "SELECT [LinkCol], [Table2Col1], [Table2Col2] FROM [Table2] " & _
                  "ORDER BY [LinkCol]"

reader1 = cmd1.ExecuteReader() 
reader2 = cmd2.ExecuteReader()

Do While reader1.read
     tbl1ID = cint(reader1("LinkCol"))
     do while tbl1ID <> tbl2ID
         reader2.read()
         tbl2ID = cint(reader2("LinkCol"))
     loop
     [read data, format it, etc]
Loop

Это упрощенная версия без всех проверок, чтобы избежать ошибок и обеспечить синхронизацию читателей, но она может быть полезна для тех, кто сталкивается с подобной проблемой, когда использование одного считывателя на двух соединенных таблицах приводит к проблемам с производительностью.

Другие вопросы по тегам