SqlCeDataReader.Read 很慢
SqlCeDataReader.Read is slow
我有一个 vb.net 应用程序,它从 SQL Server CE 数据库的两个表中调用大量数据(大约 65,000 行)。
代码非常简单:
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 倍。
问题似乎是由于 sql 语句中的 LEFT JOIN。通过执行两个 readers,每个 table 一个,并在代码中同步它们,我获得了巨大的速度提升。类似于以下内容:
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
这是一个简化版本,没有所有检查以避免错误并确保 reader 保持同步,但它可能对遇到类似问题的人有所帮助 reader 在两个加入的 table 上导致性能问题。
我有一个 vb.net 应用程序,它从 SQL Server CE 数据库的两个表中调用大量数据(大约 65,000 行)。
代码非常简单:
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 倍。
问题似乎是由于 sql 语句中的 LEFT JOIN。通过执行两个 readers,每个 table 一个,并在代码中同步它们,我获得了巨大的速度提升。类似于以下内容:
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
这是一个简化版本,没有所有检查以避免错误并确保 reader 保持同步,但它可能对遇到类似问题的人有所帮助 reader 在两个加入的 table 上导致性能问题。