【发布时间】:2017-08-17 12:45:33
【问题描述】:
我在 VBA 中有一个过程,我已经使用了一段时间来从 SQL DB 中提取数据集。
填充模板的时间总是不到 1 分钟,但从最近几天开始,它的时间已经超过 10 分钟。数据库没有任何变化,我的 VBA 代码也没有任何变化:
卡住了:
Sheets("NEW").Range("A3").CopyFromRecordset rst
我什至从 Office 2013 升级到 2016,但问题仍然存在。大家猜猜是什么原因?
我的代码
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
Dim Combine As String
Dim ow As Long
Dim ok As Integer
Dim i As Long
ConnectionString = "Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=True;User ID=xxxx;Data Source=xxxx;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Share_Assignment_Automation"
cnn.Open ConnectionString
cnn.CommandTimeout = 900
StrQuery = "SELECT [Organization],null as [ERP Segment 1],[Effective date of assignment to Team],[Expiration date of assignment to Team],null as [Last Modified By],null as [Last Modified Date],[Territory Type Name],[Forecastable Flag],[Inside Sales Flag] FROM [vw_SHARETeam] with (nolock) "
rst.Open StrQuery, cnn
Sheets("TEAM").Range("A3").CopyFromRecordset rst
rst.Close
【问题讨论】:
-
我已经用代码更新了我的帖子,但是我怀疑这是与代码相关的问题,因为正如我所说,它过去几周可以正常工作,但突然变慢了
-
首先你应该摆脱那个 nolock 提示。这不是一个神奇的快速按钮。它有一些非常严重的后果,远远超出了大多数人的认识。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
-
至于性能问题,我们需要一些细节。为什么你认为查询很慢?你能发布一个实际的执行计划吗?那看起来像一个视图,是嵌套的吗?
-
当我逐步运行代码 (F8) 时,它很顺利,直到它到达提到的行: Sheets("TEAM").Range("A3").CopyFromRecordset rst 它卡在 abt 10 的位置分钟。此外,直接在 SQL 中运行查询时,只需不到一分钟即可拉取整个表
-
所以不是查询很慢......尽管一分钟的查询对我来说似乎很慢。我们在这里谈论多少行?
标签: sql sql-server vba excel adodb