2014-01-27 4 views
0

У меня есть запрос доступа Access, и он отлично работает. Тем не менее, на столе, которое составляет около 700 записей, требуется около 8-10 секунд. FROM - это еще один запрос с очень маленьким временем запроса. Я сузил его до функции MAX(), потому что когда я удаляю эту функцию, она работает с очень небольшим временем запроса. Что я могу сделать, чтобы ускорить это? Я собираюсь предположить, что в базу данных поступает больше данных, чем дольше будет требоваться запрос.Access Query MAX() Замедляет запрос

SELECT FirstName, LastName, TeamID, MAX(total) AS totalMax 
     FROM attendanceViewAll 
      WHERE TeamID IN(5,9,13) 
      GROUP BY FirstName, LastName, TeamID 

Это Sub Query, в основном он выбирает кучу данных из таблицы. Это происходит менее чем за секунду. Результатом этого запроса является все упорядоченное по дате и agentID. Затем я использую вышеуказанный запрос, чтобы найти MAX(total), поэтому я могу сгруппировать агенты для сводки. Я использую следующий запрос для других отчетов.

SELECT 
    a1.TeamID, 
    a1.FirstName, 
    a1.LastName, 
    a1.incurredDate, 
    a1.points, 
    a1.OneFallOff, 
    a1.TwoFallOff, 

    (select sum(a2.actualPoints) 
     from attendanceView as a2 where a2.agentID = a1.agentID and a2.incurredDate <= a1.incurredDate) as total, 

a1.comment, a1.linked, a1.FallOffDate 
FROM attendanceView as a1; 
+0

Как вы собираете свой просмотр 'attendanceViewAll'? – Brad

+0

Не зная, что делает подзапрос, бессмысленно предлагать стратегии оптимизации. –

+0

Я отредактировал с другим запросом. –

ответ

2

Вашего [attendanceViewAll] запрос с использованием связанного подзапроса для получения общей суммы (ref: ваш предыдущий вопрос here). Теперь вы запрашиваете MAX() этого общего числа, что совпадает с SUM() значений [TwoFallOff]. То есть для

incurredDate TwoFallOff total 
------------ ---------- ----- 
    2014-01-10   2  2 
    2014-01-11   3  5 
    2014-01-12   1  6 

MAX (всего) такое же значение, как SUM (TwoFallOff). Большая разница в том, что для получения каждого значения для [total] вам нужно запустить коррелированный подзапрос, тогда как для получения каждого значения для [TwoFallOff] вы этого не сделаете.

Другими словами, я подозреваю, что ваш текущий запрос медленный, потому что MAX() заставляет коррелированный подзапрос в [visitanceViewAll] выполняться много раз. Вы можете получить более быструю реакцию, если у вас есть текущий запрос, обратившись обратно обратно в [attendanceView] и SUM() значения [TwoFallOff].

0

Что вам нужно, это индекс с несколькими столбцами, и он должен быть почти мгновенным.

Use the interface как эта ссылка описывает, если вам нужна помощь в этом. Тем не менее, ваш индекс должен быть первым по критериям, вторичным на полях, используемых в группе, так что я бы индекс по

TeamID, FirstName, LastName

+0

У меня уже была таблица, в которой содержались имена агентов, индексированные таким образом. Я изменил порядок группы без везения, еще 8-10 секунд. –