SQL查询循环随着时间的推移而减慢

时间:2015-04-21 18:33:17

标签: sql-server excel vba excel-vba

我有一个本地存储的数据库,并使用Excel从中获取小表,然后我处理,格式化等并保存为平面文件。我需要大约7,000个文件。

这个过程开始得非常快,但随着时间的推移,它会变慢,每个文件的结束时间大约是第一个文件的10倍。这是循环:

        For i = firstrow + 1 To lastrow

    RemoveConnections
    Application.CutCopyMode = False

        'Get annual data

        Sheets("data").Cells.Delete
        sqlstring1 = "SELECT [compnumber],[mapcode],[amount],[reportd],[reportm],[reporty]  FROM [Mergent].[dbo].[Mastertable_proc]" & _
        "WHERE Compnumber = '" & Sheets("list").Cells(i, 1).Value & "' and reporttype='A';"
        connstring = _
        "ODBC;Driver=SQL Server;Server=MY-PC;UID=Andy;Trusted_Connection=Yes;Database=DataM"
        With Sheets("data").QueryTables.Add(Connection:=connstring, Destination:=Sheets("data").Range("a1"), Sql:=sqlstring1)
        .RefreshStyle = xlOverwriteCells
        .Refresh BackgroundQuery:=False
        End With

...

processes data and saves file

...

next i

在每个循环开始时调用以下Remove Connections宏以删除所有现有连接:

Sub RemoveConnections()
Dim xConnect As Object
On Error Resume Next
For Each xConnect In ActiveWorkbook.Connections
xConnect.Delete
Next xConnect
For Each listobj In Sheets("data").ListObjects
listobj.Delete
Next listobj
End Sub

我非常确定处理本身和保存文件不是问题所在,因为我可以在没有它的情况下运行宏,并且它会随着时间的推移而减慢。

任何人都有任何想法为什么这会减慢?我注意到随着时间的推移,SQLserver.exe会在我的计算机上占用越来越多的RAM,但是当它减慢时我仍然处于最大值内,但它告诉我我在循环中做错了就像不关闭一样连接什么的。

我还尝试过在每个循环中编辑单个连接的版本,因此每次都不会创建一个新版本,但它仍然会随着时间的推移而减慢,我不明白为什么。

1 个答案:

答案 0 :(得分:0)

我猜想减速是由连接到数据库/从数据库断开7000次引起的......是否可以运行查询一次将整个Mastertable_proc拉入Excel,然后使用循环处理并保存每个唯一的Compnumber ?