Почему открытие соединения с моей базой данных занимает так много времени? - PullRequest
1 голос
/ 20 июня 2019

Я создал некоторый код для извлечения информации из базы данных 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 запросов. Я мог бы немного изменить настройку, чтобы я больше не использовал пользовательскую функцию, но время соединения кажется необычно большим.

Любой совет приветствуется!

1 Ответ

0 голосов
/ 20 июня 2019

Попробуйте выполнить профилирование вашего кода, выполнив это, и изучите непосредственное окно (открытое Ctrl + G в редакторе VBA:

    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

Возможно, проблема в других функциях, таких как модули

UPD: 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, а из-за выполнения этого запроса, который содержит условия и групповые операции (SUM) на SQL Server, так что это проблема базы данных. Эта проблема, если она очень неудобная, должна решаться другими подходами (индексация, разделение данных, OLAP и т. Д.)

...