У меня есть база данных Access из 4M строк, каждая из которых представляет отдельный заказ клиента.
Мне нужно выполнить запрос из Excel (я использую VBA), чтобы получить только заказы от клиентов в REGION1
.
Я попробовал следующее (имена должны быть достаточно понятны):
Sub Query()
Dim cn As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String
strFile = "C:\Users\MyName\Desktop\DataBase.accdb"
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
strSQL = "SELECT [CUSTOMER], [DATE], [REVENUE]" _
& "FROM [SALES DB]" _
& "WHERE [REGION]='REGION1'"
rs.Open strSQL, cn, 0, 1
Worksheets(1).Cells(2, 1).CopyFromRecordset rs
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Это работает хорошо, но немного медленно, так как возвращает ~ 600 тыс. Строк.
Поэтому я подумал: «Кому нужен подробный список всех заказов клиентов? Мне просто нужен ежемесячный агрегат. Это должно уменьшить количество возвращаемых строк и, следовательно, повысить скорость!».
Поэтому я изменилсямой код:
strSQL = "SELECT [CUSTOMER], MONTH([DATE]), YEAR([DATE]), SUM([REVENUE])" _
& "FROM [SALES DB]" _
& "WHERE [REGION]='REGION1'"
& "GROUP BY [CUSTOMER], MONTH([DATE]), YEAR([DATE])"
Как я и ожидал, теперь отображаются результаты только ~ 450K.Дело в том, что запрос на самом деле стал медленнее.
На самом деле мне лучше извлечь несгруппированные данные, а затем агрегировать их с помощью простой сводной таблицы.
Как меньше данных можно извлечь медленнее?Я знаю, что между ними нужно выполнить некоторые вычисления, но все же.
Кто-нибудь знает, как мне решить эту проблему?