ADO RecordSet批量检索运行过慢

时间:2016-08-31 16:09:58

标签: sql vba excel-vba ms-access ado

我正在使用Excel-VBA将ADO连接到MS-Access数据库。它正在执行Access数据库中的存储过程。返回有大约900条记录,包含13个字段。我使用以下VBA代码:

Dim RS As ADODB.Recordset

Call OpenDatabase 'Subroutine that opens an ADO connection: DatabaseName

Set RS = DatabaseName.Execute("SELECT * FROM My_Procedure")  'This DOES return a recordset

Do While Not RS.EOF
    Debug.Print RS(0) 
    RS.MoveNext
Loop

Call CloseDatabase 'Another sub

数据库连接在这里:

Sub OpenDatabase

    Dim ConnString as String
    Set DB = New ADODB.Connection

    ConnString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My_DB_Path & "; Persist Security Info=False;"
    With DB
        .ConnectionString = ConnString
        .ConnectionTimeout = 10
        .Open
    End With

End Sub

以下是名称为generalized的查询:

SELECT Col1, Col2, Col3,
(SELECT Col4 FROM t2 where t2.Col1 = t1.Col1 AND t2.Col2 = t1.Col2 and Col4 IS NOT NULL) As Col4,
(SELECT Col5 FROM t2 where t2.Col1 = t1.Col1 AND t2.Col2 = t1.Col2 and Col5 IS NOT NULL) As Col5,
... (Same through Col13)
FROM t1

在存储过程中,字段1,2和3都非常简单,一切都快速移动。但是,字段#4-13遗憾的是所有更复杂的select语句,这似乎是问题的一部分

这不是一个更好的方法,但在MS-Access的限制范围内,这是我必须做的,以我需要呈现它的方式格式化数据。

当我在Access中运行此过程时,计算并显示DataSheet视图中的所有内容可能需要15-20秒。当我运行上面的VBA代码时,Do循环大约需要45秒来打印所有900行RS(0,1,2),但是使用Debug.Print RS(3> 12),它需要超过280每场的秒数。我怀疑每次我在VBA中要求它重新计算所有这些嵌入式子查询,但我不知道为什么。

理想情况下,我希望Access运行该过程并生成结果,我只需将每条记录拉入VBA变量以进行进一步处理。有关如何加快检索过程的任何想法吗?

编辑添加样本数据

这是查询正在运行的数据的一般化示例,以及完成后应该看起来的样子。输入就像:

Col1|Col2|Col3|Col4|Col5|...
A   |01  |X   |    |
A   |01  |    |Y   |
A   |02  |X   |    |
A   |02  |    |Y   |
B   |01  |    |X   |
B   |02  |    |X   |
B   |02  |Y   |    |
B   |02  |    |    |Z

输出就像:

Col1|Col2|Col3|Col4|Col5|...
A   |01  |X   |Y   |
A   |02  |X   |Y   |
B   |01  |    |X   |
B   |02  |Y   |X   |Z

1 个答案:

答案 0 :(得分:1)

从您当前的示例数据和所需结果中,您当然可以优化查询。现在,您运行9个单独的子查询以从每个相应列中检索非空值。简单地说,在列3-13上使用MAX()运行聚合查询,分组在前两列:

SELECT Col1, Col2, Max(Col3) As C3,  Max(Col4) As C4,  Max(Col5) As C5, ...
       Max(Col13) As C13
FROM t1
GROUP BY Col1, Col2