2015-01-09 3 views
0

Я использую функцию для запроса базы данных и возврата результата в 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 
+1

Это не VBA, это соединение. Поэкспериментируйте с различными способами подключения к базе данных. Вы можете найти приемлемую альтернативу. Это может вам помочь: [ConnectionStrings.com] (http://www.connectionstrings.com/) –

ответ

0

Дайте MS Power Query Надстройка попробовать. Это очень удобно, чтобы захватывать данные из разных источников. Вы также можете преобразовать собранные данные перед их загрузкой в ​​таблицу Excel als. Power Query имеет некоторые ограничения использования в зависимости от версии Excel 2013 (например, Professional), которую вы используете.

Смежные вопросы