0

我有一个 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 倍。

4

1 回答 1

0

问题似乎是由于 sql 语句中的 LEFT JOIN。通过执行两个读取器(每个表一个读取器)并将它们同步到代码中,我获得了巨大的速度。类似于以下内容:

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

这是一个简化版本,没有进行所有检查以避免错误并确保读取器保持同步,但它可能对遇到类似问题的人有所帮助,即在两个连接表上使用一个读取器会导致性能问题。

于 2015-11-11T22:10:28.710 回答