【问题标题】:VBA to SQL Link best practice and performanceVBA to SQL Link 最佳实践和性能
【发布时间】:2015-12-01 19:12:17
【问题描述】:

我有以下问题。通常,当我在 VBA 中使用 SQL 命令生成字符串时,检索结果不会超过几秒钟(有几个运行查询非常“繁重”)。

但是,在一种“轻量级”情况下,将其从 VBA 发送到 SQL 需要几分钟时间。但是,当我在 SQL Server 中自行运行 SQL 代码时,代码运行时间不到一秒。所以我想,我的 VBA 和 SQL 之间的连接函数有问题吗?我在下面列出了这两个代码:

首先,我有以下代码在我的 VBA 脚本和 SQL-Server 之间建立连接(输入:SQL 字符串;输出:SQL-Server 表结果)

Private Function GetSQLData(ByVal SQLString As String)
    Dim sCon As String
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset

    sCon = "Provider = "MSDASQL.1;"
    sCon = sCon & "driver={SQL Server};"
    sCon = sCon & "Server=PCNAME\SQLEXPRESS;"
    sCon = sCon & "Database=HELLOFORUM;"
    sCon = sCon & "uid="";"
    sCon = sCon & "pwd:="";"

    '/ I create the connection to SQL Server
    Set cnn = New ADODB.Connection
    With cnn
        .Open sCon
        .CursorLocation = adUseClient
        .CommandTimeout = 0
    End With


    '/ Load results
    Set rst = New ADODB.Recordset
    With rst
        .CursorLocation = adUseServer
        .Open Source:=SQLString, ActiveConnection:=cnn, CursorType:=adOpenForwardOnly, _
        LockType:=adLockOptimistic, Options:=adCmdText
    End With

    If rst.State = 1 Then
        If Not rst.EOF Then
            GetSQLData = rst.GetRows()
        End If
    End If
End Function

我有一个数据库,如下所示:

ID   timetag              val
ID01 1990-01-01 00:00:00  20
ID01 1990-01-01 00:01:00  23
[...]

产生问题的代码如下:

WITH rows AS (
    SELECT *,Row_Number() Over (ORDER BY timetag) as RN FROM [Database.dbo]
where ID = 'ID01' AND timetag between '1990-01-01 00:00:00' AND '1990-01-20 00:00:00')
SELECT DATEDIFF(minute,mc.timetag,mp.timetag) as differ1, mc.timetag as timetag1 ,mp.timetag as timetag2
    FROM rows mc  JOIN rows mp On mc.rn = mp.rn - 1 where   DATEDIFF(minute,mc.timetag,mp.timetag) > 1 order by timetag1

此查询的输出是一个表,其中后续时间标签之间的差异不等于 1(分钟)。例如:

differ1    timetag1               timetag2
2          1990-07-04 00:00:00    1990-07:04 00:02:00

正如我所说,它在 SQL 服务器中运行得很快,但当我尝试从 VBA 执行查询时却非常慢。有什么建议 - 特别是我遵循“最佳/更好的做法”选项从 VBA 连接到 SQL 服务器?

更新:更奇怪的是,仅从第 7 个月及以上开始变慢。

【问题讨论】:

  • 使用参数化查询,或者更好的是,使用存储过程。我确信 SQL 正在做某种 ado 无法利用的优化/编译/正则化/其他花哨的术语
  • 感谢阅读@MitchWheat
  • @MitchWheat 谢谢你的链接

标签: sql-server vba excel


【解决方案1】:

如果您只打算读取记录,您可以尝试将 LockType 更改为 adLockReadOnly。

您还可以将光标位置从客户端更改为服务器 (AdUseServer)。

【讨论】:

  • 不幸的是,修改一个或两个选项并没有缩短执行时间(我在稍后的步骤中还计划更改数据)
  • 您是否尝试过单步执行代码?这会告诉你哪条生产线表现不佳。我怀疑它会在您打开记录集或 GetRows 时出现。
  • 在打开记录集期间
  • 您是否尝试过从 MSDASQL 切换到 SQL Native Client (SQLNCLI11)? msdn.microsoft.com/en-us/library/ms130978.aspx
  • 听起来好像没有任何 ADO 配置更改可以帮助您。相反,是时候看看 SQL。您可以尝试针对 SSMS 中的查询和通过 VBA 运行 SQL Profiler。这应该可以帮助您跟踪差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多