Производительность запросов в Access 2007 – создание бэкэнд SQL Server Express

Я уже несколько секунд стучал головой об этом вопросе, и решил, что я должен попросить о помощи. У меня есть таблица, в которой хранятся данные регистратора температуры / влажности (в настоящее время более 775 000 записей), из которых я пытаюсь запустить статистический запрос. Проблема в том, что это часто занимает до двух минут, а иногда и не возвращается вообще, заставляя меня принудительно закрыть программу (Control-Alt-Delete). Во-первых, у меня не было такой же проблемы – только после того, как я ударил магическую отметку в 500 тыс. Записей, я начал серьезно замедляться, постепенно ухудшаясь, поскольку все данные были скомпилированы и импортированы в таблицу.

Вот запрос (сквозной):

SELECT dbo.tblRecorderLogs.strAreaAssigned, Min(dbo.tblRecorderLogs.datDateRecorded) AS FirstRecorderDate, Max(dbo.tblRecorderLogs.datDateRecorded) AS LastRecordedDate, Round(Avg(dbo.tblRecorderLogs.intTempCelsius),2) AS AverageTempC, Round(Avg(dbo.tblRecorderLogs.intRHRecorded),2) AS AverageRH, Count(dbo.tblRecorderLogs.strAreaAssigned) AS Records FROM dbo.tblRecorderLogs GROUP BY dbo.tblRecorderLogs.strAreaAssigned ORDER BY dbo.tblRecorderLogs.strAreaAssigned; 

Вот структура таблицы, в которой хранятся данные диаграммы:

 idRecorderDataID Number Primary Key datDateEntered Date/Time (indexed, duplicates OK) datTimeEntered Date/Time intTempCelcius Number intDewPointCelcius Number intWetBulbCelcius Number intMixingGPP Number intRHRecorded Number strAssetRecorder Text (indexed, duplicates OK) strAreaAssigned Text (indexed, duplicates OK) 

Я пытаюсь написать программу, которая позволит людям извлекать данные из этой таблицы на основе Area Assigned, а также даты начала и окончания. С размером набора данных, который у меня есть в настоящее время, этот вид отчета просто слишком много для его обработки (кажется), и машина никогда не возвращает ответ. Я должен был продлить тайм-аут ODBC до почти 180 секунд в любых запросах, связанных с этой таблицей, просто из-за размера. Я мог бы использовать некоторую серьезную помощь, если у кого-то есть. Заранее спасибо!

– Отредактировано 08/13/2012 @ 1050 часов –

Я не смог протестировать запрос на SQL Server из-за того, что ИТ-отдел взял на себя управление рассматриваемой машиной и кто-то вошел в нее на полную ставку с помощью консоли удаленного управления. Я пробовал промежуточный шаг, чтобы уменьшить влияние проблемы производительности, но я все еще ищут постоянное решение этой проблемы.

Промежуточный шаг:

Я создал локальную таблицу, отражающую структуру таблицы SQL Server dbo.tblRecorderLogs, в которую я вставляю INSERT INTO, используя прежний оператор SELECT в качестве подзапроса. Затем из этой «временной» локальной таблицы извлекается любой последующий статистический анализ. По завершении процесса локальная таблица обрезается.

– Отредактировано 08/13/2012 @ 1217 часов –

Завершив показанный запрос в консоли управления SQL Server, потребовалось 1 минуту 38 секунд для завершения в соответствии с таймером запросов, предоставляемым консолью.

– Редактировать 08/15/2012 @ 1531 час –

Пытался запустить запрос в качестве инструкции VBA DoCmd.RunSQL для заполнения временной таблицы, используя следующий код:

 INSERT INTO tblTempRecorderDataStatsByArea ( strAreaAssigned, datFirstRecord, datLastRecord, intAveTempC, intAveRH, intRecordCount ) SELECT dbo_tblRecorderLogs.strAreaAssigned, Min(dbo_tblRecorderLogs.datDateRecorded) AS MinOfdatDateRecorded, Max(dbo_tblRecorderLogs.datDateRecorded) AS MaxOfdatDateRecorded, Round(Avg(dbo_tblRecorderLogs.intTempCelsius),2) AS AveTempC, Round(Avg(dbo_tblRecorderLogs.intRHRecorded),2) AS AveRHRecorded, Count(dbo_tblRecorderLogs.strAreaAssigned) AS CountOfstrAreaAssigned FROM dbo_tblRecorderLogs GROUP BY dbo_tblRecorderLogs.strAreaAssigned ORDER BY dbo_tblRecorderLogs.strAreaAssigned 

Проблема возникает, когда код выполняется, запрос занимает очень много времени – он сталкивается с таймаутом перед его завершением. Все еще надеясь на «волшебную пулю», чтобы исправить это …

– Отредактировано 08/20/2012 @ 1241 час –

Единственное «квази» решение, которое я нашел, неоднократно запускает неудавшийся запрос (вроде как загрунтовать насос как бы), так что, когда запрос снова вызван моей программой, он имеет относительную вероятность фактически завершить до ODBC Ошибка SQL Server. По сути, грязный грязный хак – но у меня нет лучшего, чтобы бороться с этой проблемой.

  1. Я попытался создать представление, которое работает на стороне сервера, но не ускоряет работу.
  2. Собственные поля, агрегированные, индексируются правильно, поэтому я не могу вносить туда никаких изменений.
  3. Я просто извлекаю информацию из базы данных, которая сразу же полезна для пользователя – здесь нет безумия «SELECT *».

Я думаю, что я официально, из-за вещей, чтобы попытаться – помимо того, чтобы бросать сырую вычислительную мощность на проблему, которая сейчас не является решением, поскольку элемент не живет, и у меня нет бюджета для приобретения лучшего оборудования. Я опубликую это как «ответ» и оставлю его до 3 сентября. Если, если у меня нет лучших ответов, я приму свой ответ и приму поражение.

Когда мне приходилось запускать функции min / max по нескольким полям из одной таблицы, мне часто приходилось быстрее выполнять каждый столбец отдельно в качестве подзапроса в строке из основного / внешнего запроса.

Таким образом, ваш запрос будет следующим:

 SELECT rLogs1.strAreaAssigned, rLogs1.FirstRecorderDate, rLogs2.LastRecorderDate, rLog3.AverageTempC, rLogs4.AverageRH, rLogs5.Records FROM ((( (SELECT strAreaAssigned, min(datDateRecorded) as FirstRecorderDate FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs1 inner join (SELECT strAreaAssigned, Max(datDateRecorded) as LastRecordedDate, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs2 on rLogs1.strAreaAssigned = rLogs2.strAreaAssigned) inner join (SELECT strAreaAssigned, Round(Avg(intTempCelsius),2) AS AverageTempC, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs3 on rLogs1.strAreaAssigned = rLogs3.strAreaAssigned) inner join (SELECT strAreaAssigned, Round(Avg(intRHRecorded),2) AS AverageRH, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs4 on rLogs1.strAreaAssigned = rLogs4.strAreaAssigned) inner join (SELECT strAreaAssigned, Count(strAreaAssigned) AS Records, FROM dbo.tblRecorderLogs GROUP BY strAreaAssigned) rLogs5 on rLogs1.strAreaAssigned = rLogs5.strAreaAssigned ORDER BY rLogs1.strAreaAssigned; 

Если вы возьмете свой запрос и выше, скопируйте их в одно и то же окно запросов на SQL Server и запустите оценочный план выполнения, вы сможете сравнить их и посмотреть, какой из них лучше работает.

  • Существуют ли случаи, когда MS Access является лучшим выбором, чем SQL Server?
  • Как выбрать данные из базы данных Microsoft Access в SQL Server?
  • Разделить строку Microsoft SQL
  • SETING CONTEX_INFO () ИСПОЛЬЗОВАНИЕ MS ACCESS VBA TO - SQL Server
  • Обновление до SQL View не выполняется из Access with Linked Table
  • как сравнить данные sql-сервера с данными MS Access
  • SQL Server возвращает другую запись после вставки в связанную таблицу MS Access
  • Получить результат на основе значения атрибута столбца
  • Приложение MS Access работает в автономном режиме
  • есть простой фронт для сервера sql?
  • Программно проверить наличие повреждения базы данных Access?
  • Давайте будем гением компьютера.