为啥打开与我的数据库的连接需要这么长时间?
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。但也许这只是需要耐心等待的情况。以上是关于为啥打开与我的数据库的连接需要这么长时间?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 SELECT 查询不需要我的 UPDATE 查询需要这么长时间?