为啥打开与我的数据库的连接需要这么长时间?

Posted

技术标签:

【中文标题】为啥打开与我的数据库的连接需要这么长时间?【英文标题】:Why is it taking so long to open a connection to my database?为什么打开与我的数据库的连接需要这么长时间? 【发布时间】:2019-06-20 03:39:42 【问题描述】:

我创建了一些代码,通过自定义函数将信息从 sql 数据库中提取到 excel 中。目前,代码只需大约 5-7 秒即可打开连接。代码的所有其他部分,包括查询本身都非常快。知道为什么要花这么长时间吗?

这是针对我本地计算机上的 sqlsever 的。

Function Lob_amt(sp_name As String, l_date As String) As Double


Dim Conn As ADODB.Connection
Set Conn = New ADODB.Connection
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset

Dim l_year As Double
Dim l_name As String


l_year = Year(l_date)



Dim sqlQry As String, sConnect As String

sqlQry = "SELECT sum(lob_lobbying.Amount)FROM lob_lobbying" & _
    " WHERE lob_lobbying.Latest = 'Y'" & _
    " AND lob_lobbying.IndTot ='Y'" & _
    " AND UltOrg = '" & sp_name & "'" & _
    " AND CycleYear in ('" & l_year & "')"

sConnect = "Driver=SQL Server;Server=DESKTOP-L9CVIVP;Database=lobbying;Trusted_Connection=yes;"


Conn.Open sConnect

recset.Open sqlQry, Conn

If IsNull(recset.Fields(0).Value) Then
    Lob_amt = 0
    Else

    Lob_amt = recset.Fields(0).Value

    End If
recset.Close
Conn.Close
Set recset = Nothing
Set Conn = Nothing


End Function

我预计连接需要毫秒,但打开连接需要 5-7 秒。以我当前的设置作为自定义函数,我将拉近 80,000 个查询。我可以稍微更改设置,以便不再使用自定义功能,但连接时间似乎异常长。

感谢任何建议!

【问题讨论】:

如果手动打开数据库,是不是比5-7秒快? 是的,使用 SSMS 不到一秒。 好的..为了确保连接需要这么长时间,您可以使用 F8 逐步检查您的代码吗? 模糊的想法。您说手动打开数据库时会快速打开它。但是你是怎么做到的?我在想可能不是打开数据库的时候,而是开始 SQL的时候了?自从我在本地运行 SQL 已经有一段时间了,但值得检查一下。 我在 SSMS 中打开它,我在 excel 打开时在后台运行它,所以 sql 正在运行。不过感谢您的提示! 【参考方案1】:

尝试通过执行此操作来分析您的代码并研究即时窗口(在 VBA 编辑器中由 Ctrl + G 打开:

    Function Lob_amt(sp_name As String, l_date As String) As Double

    Debug.Print "begin Lob_amt function: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
    Dim Conn As ADODB.Connection
    Set Conn = New ADODB.Connection
    Dim recset As ADODB.Recordset
    Set recset = New ADODB.Recordset

    Dim l_year As Double
    Dim l_name As String


    l_year = Year(l_date)



    Dim sqlQry As String, sConnect As String

    sqlQry = "SELECT sum(lob_lobbying.Amount)FROM lob_lobbying" & _
        " WHERE lob_lobbying.Latest = 'Y'" & _
        " AND lob_lobbying.IndTot ='Y'" & _
        " AND UltOrg = '" & sp_name & "'" & _
        " AND CycleYear in ('" & l_year & "')"
    Debug.Print vbNewLine & sqlQry & vbNewLine
    sConnect = "Driver=SQL Server;Server=DESKTOP-L9CVIVP;Database=lobbying;Trusted_Connection=yes;"


    Conn.Open sConnect
        Debug.Print "Lob_amt function Conn.Open: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
    recset.Open sqlQry, Conn

    If IsNull(recset.Fields(0).Value) Then
        Lob_amt = 0
           Debug.Print "Lob_amt Lob_amt = 0: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
        Else

        Lob_amt = recset.Fields(0).Value
                    Debug.Print "Lob_amt recset.Fields(0).Valu: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
        End If

    recset.Close
    Debug.Print "Lob_amt recset closed: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
    Conn.Close
    Debug.Print "Lob_amt conn closed: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
    Set recset = Nothing
    Set Conn = Nothing


    End Function

问题可能在模块的其他功能中

更新: SELECT sum(lob_lobbying.Amount)FROM lob_lobbying WHERE lob_lobbying.Latest = 'Y' AND lob_lobbying.IndTot ='Y' AND UltOrg = 'Cigna Corp' AND CycleYear in ('2006') 这个生成的查询被传递给Open 方法,所以这些冻结(最多5 秒)不是由于Open 方法本身,而是由于在SQL Server 上执行这个包含条件和组操作(SUM)的查询,所以这是数据库的问题。这个问题,如果很不舒服,应该通过其他方法(索引、数据划分、OLAP等)来解决

【讨论】:

我得到以下信息:开始 Lob_amt 函数:06:01:47.45 Lob_amt 函数 Conn.Open:06:01:52.99 Lob_amt recset.Fields(0).Valu:06:01:53.39 Lob_amt recset closed: 06:01:53.39 所以,问题确实出现在 Conn.open 行。 我认为这是由于使用了 sum 函数。尝试使用 SSMS 中的 sum() 值运行您的查询,我认为它会获得相同的执行时间成本。已编辑的调试答案输出要在 SSMS 中检查的 SQL 字符串 求和应该在 SSMS 中完成,查询应该只输出一个值。我得到这个输出:开始 Lob_amt 函数:06:18:10.86 SELECT sum(lob_lobbying.Amount)FROM lob_lobbying WHERE lob_lobbying.Latest = 'Y' AND lob_lobbying.IndTot ='Y' AND UltOrg = 'Cigna Corp' AND CycleYear在('2006')Lob_amt 函数 Conn.Open:06:18:15.94 Lob_amt recset.Fields(0).Valu:06:18:16.35 Lob_amt recset 关闭:06:18:16.35 Lob_amt conn 关闭:06:18:16.35 尝试在 SSMS 中运行生成的查询SELECT sum(lob_lobbying.Amount)FROM lob_lobbying WHERE lob_lobbying.Latest = 'Y' AND lob_lobbying.IndTot ='Y' AND UltOrg = 'Cigna Corp' AND CycleYear in ('2006'),我认为你应该得到相同的 5 秒 我敢打赌 open 会启动几秒钟,因为它会启动这个生成的查询,其中包含条件和求和操作。因此,如果可能的话,时间问题是加快数据库性能。我认为应用索引或其他方法,甚至是 OLAP。但也许这只是需要耐心等待的情况。

以上是关于为啥打开与我的数据库的连接需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个查询需要这么长时间?

为啥我的 gradle 需要这么长时间? > 13 分钟

为啥我的 301 重定向需要这么长时间?

为啥我的 SELECT 查询不需要我的 UPDATE 查询需要这么长时间?

为啥我的 Create React App Dev Server 需要这么长时间才能启动?

为啥更新域的名称服务器需要这么长时间? [关闭]