Я создал приложение календарного типа в MS Access 2013 с SQL Server в качестве внутреннего сервера (каждый день в календаре является подчиненной формой). Около 20 таблиц связаны с помощью линии Call AttachDSNLessTable([details here]) . На месте скорость просто отличная, но когда я пытаюсь получить к ней доступ через VPN, требуется всего 6 минут, чтобы просто загрузить домашний экран. А все остальное занимает как минимум в 5 раз больше времени.

Я не знаю альтернативных вариантов. Возможно ли сделать базу данных доступной через Интернет? Это даже ускорило бы вещи? Или мы должны увеличить пропускную способность VPN? Какой мой лучший вариант здесь? Благодарю.

1 ответ1

2

Ваша общая прикладная архитектура (Доступ с помощью связанных таблиц), вероятно, имеет недостатки для этой цели. Возможно, это можно исправить (в основном), но не без некоторой ревизии.

Ключевой вопрос заключается в том, что когда Access является внешним интерфейсом, сам Access определяет, может ли он отправить весь запрос для обработки SQLServer, и часто приходит к выводу, что он не может, поэтому он часто выполняет сам запрос, загружая весь Таблица. Это особенно верно для объединений, особенно если в каждой из используемых таблиц нет сильного первичного ключа.

Вот документ MS Technet по производительности для Access связанных таблиц с помощью SQLServer: https://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx

Наиболее значимый бит это:

Основная причина снижения производительности запросов заключается в том, что запрос, включающий очень большие таблицы, требует, чтобы все данные из одной или нескольких таблиц были загружены на клиент. Это может произойти, даже если объединения или критерии ограничивают результирующий набор небольшим количеством записей. Это происходит потому, что иногда ядро базы данных Office Access определяет, что оно не может отправить весь запрос на SQL Server. Вместо этого он отправляет несколько запросов, часто включая запросы, которые запрашивают все строки в таблице, а затем объединяет или фильтрует данные на клиенте. Если критерии требуют локальной обработки, даже запросы, которые должны возвращать только выбранные строки из одной таблицы, могут требовать возврата всех строк в таблице.

  • Использование диагностических утилит JET/ODBC для определения того, где выполняется вся работа.
  • Использование Snapshot RecordSets в доступе, где это возможно.
  • Выдвиньте логику запроса на SQLServer с помощью представлений и хранимых процедур / функций.
  • Установите твердые ключи и индексы в SQLServer и убедитесь, что индексы дефрагментированы по мере необходимости.
  • Кэширование часто используемых данных в Access.

Ссылка выше имеет много полезных советов и технических деталей для тех, кто на вашей должности. Удачи!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .