Я использую функцию для запроса базы данных и возврата результата в excel. Я вызываю функцию 3 раза, и для возврата всех данных требуется около 15 минут. Те же запросы, которые я выполняю в Aqua Data Studio, получают результат за 20 секунд на запрос.Почему мои запросы sql в Excel медленные?
Не могу понять, почему в Excel это так медленно. Как улучшить скорость, можно ли изменить код, чтобы он мог выполняться быстрее?
Вот мои функции написаны в VBA. Первая называется во второй.
Function MyQuery(ConnString As String, ByVal QueryString As String, MyDestination As Range, DispName As String) As Boolean
'
' MyQuery(ConnString, QueryString, MyDestination, DispName)
'
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=ConnString, Destination:=MyDestination).QueryTable
.CommandText = QueryString
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = DispName
.Refresh BackgroundQuery:=False
End With
MyQuery = True
End Function
А вот вторая функция, в которой я пишу SQL:
Sub GetData(DestinationRange As Range, QueryTableName As String, Lacs As String, Racs As String, StartTime As String, EndTime As String, Capacity As String)
'
'GetData(DestinationRange, QueryTableName, Lacs, Racs, StartTime, EndTime, Capacity)
'
Dim ConnectionString As String
Dim FuncFeedback As Boolean
ConnectionString = "ODBC;DSN=PostgreSQL30;DATABASE=xxxx;SERVER=xxx.xxx.xxx.xxx;PORT=5432;UID=xxxxx;;SSLmode=disable;ReadOnly=0;Protocol=7.4;FakeOidIndex=0;ShowOidColumn=0;RowVersioning=0;ShowSystemTables=0;ConnSettings=;Fetch=100;Socket=4096;UnknownSizes=0;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0;CommLog=0;Optimizer=0;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsAsLongVarchar=0;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;;LFConversion=1;UpdatableCursors=1;DisallowPremature=0;TrueIsMinus1=0;BI=0;ByteaAsLongVarBinary=0;UseServerSidePrepare=1;LowerCaseIdentifier=0;GssAuthUseGSS=0;XaOpt=1"
Query1 = " SELECT "
Query1 = Query1 & "TIMESTAMP::DATE::TEXT, "
'...
' AND HERE I WRITE THE SQL QUERY THIS WAY, THE WHOLE QUERY IS NOT INCLUDED
'...
Query1 = Query1 & " WHERE "
Query1 = Query1 & " (TIMESTAMP BETWEEN '" & StartTime & "' AND '" & EndTime & "')"
FuncFeedback = MyQuery(ConnectionString, Query1, DestinationRange, QueryTableName)
' MyQuery(ConnString, QueryString, MyDestination, DispName)
End Sub
Это не VBA, это соединение. Поэкспериментируйте с различными способами подключения к базе данных. Вы можете найти приемлемую альтернативу. Это может вам помочь: [ConnectionStrings.com] (http://www.connectionstrings.com/) –