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